【发布时间】:2014-05-30 06:33:54
【问题描述】:
我目前在创建 func 时遇到问题,并且是 Scheme 的初学者。为了达到这样的结果,我必须在 func 中定义 double 吗?
(func double 3 '(3 5 1))
将返回 (24 40 8),因为每个元素都加倍了 3 次。
【问题讨论】:
-
你能把你的问题说清楚一点吗?
我目前在创建 func 时遇到问题,并且是 Scheme 的初学者。为了达到这样的结果,我必须在 func 中定义 double 吗?
(func double 3 '(3 5 1))
将返回 (24 40 8),因为每个元素都加倍了 3 次。
【问题讨论】:
如果我正确理解您的问题,您可以通过以下方式实现func:
(define (func f n lst)
(do ((n n (sub1 n))
(lst lst (map f lst)))
((zero? n) lst)))
示例用法:
> (func (lambda (x) (* x 2)) 3 '(3 5 1))
=> (24 40 8)
【讨论】:
#lang racket
(define (repeat f x n)
(cond [(= n 0) x]
[else (f (repeat f x (- n 1)))]))
(define (func f n xs)
(map (λ(x) (repeat f x n)) xs))
(define (double x)
(* 2 x))
(func double 3 '(3 5 1))
【讨论】:
func,并想知道是否必须在其中定义 double。答案当然是否定的,这两个答案都证明了这一点。
可能是这样的:
(define (cmap fun arg1 lst)
(map (lambda (x) (fun arg1 x)) lst))
但你真的想这样做(cmap list 1 (get-some-calc x) (get-list)) 但很难让它接受任何咖喱论点,也许你想要多个列表。你这样做:
(let ((cval (get-come-calc x)))
(map (lambda (x) (list 1 cval x)) (get-list)))
【讨论】:
不,double 需要在func 之外,因为它将作为参数(绑定到f)传递给func:
(define (double n) (* 2 n))
(define (times f e t)
(if (= t 0)
e
(times f (f e) (- t 1))))
(define (func f t lst)
(map (lambda (e) (times f e t)) lst))
然后
> (func double 3 '(3 5 1))
'(24 40 8)
OTOH,在这种情况下,times 可以在 func 中定义,但它是一个可重用的过程,所以我将它留在外面。
【讨论】:
'double 作为消息传递,并具有内部调度和定义,特别是如果 func 要保持任何内部状态。
func 有某种状态,我认为没有必要这样做。你能详细说明一下吗?