Scheme 方案-嵌套定义混淆

Scheme 方案-嵌套定义混淆,scheme,racket,Scheme,Racket,我目前在创建func时遇到了一个难题,我是Scheme的初学者。为了得到这样的结果,我必须在func中定义double吗 (func double 3 '(3 5 1)) 将返回(24408),因为每个元素加倍3次 如果我正确理解了您的问题,这里有一种方法可以实现func: (define (func f n lst) (do ((n n (sub1 n)) (lst lst (map f lst))) ((zero? n) lst))) (define (d

我目前在创建func时遇到了一个难题,我是Scheme的初学者。为了得到这样的结果,我必须在func中定义double吗

(func double 3 '(3 5 1)) 

将返回(24408),因为每个元素加倍3次

如果我正确理解了您的问题,这里有一种方法可以实现
func

(define (func f n lst)
  (do ((n n (sub1 n))
       (lst lst (map f lst)))
      ((zero? n) lst)))
(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 (lambda (x) (* x 2)) 3 '(3 5 1))
=> (24 40 8)

如果我正确理解了您的问题,那么有一种方法可以实现
func

(define (func f n lst)
  (do ((n n (sub1 n))
       (lst lst (map f lst)))
      ((zero? n) lst)))
(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 (lambda (x) (* x 2)) 3 '(3 5 1))
=> (24 40 8)

可能是这样的:

(define (cmap fun arg1 lst)
  (map (lambda (x) (fun arg1 x)) lst))
(let ((cval (get-come-calc x)))
  (map (lambda (x) (list 1 cval x)) (get-list)))
但是你真的想这样做
(cmap列表1(获取一些计算x)(获取列表))
,但是要让它接受任何一个curred参数是非常困难的,也许你想要不止一个列表。你是这样做的:

(define (cmap fun arg1 lst)
  (map (lambda (x) (fun arg1 x)) lst))
(let ((cval (get-come-calc x)))
  (map (lambda (x) (list 1 cval x)) (get-list)))

可能是这样的:

(define (cmap fun arg1 lst)
  (map (lambda (x) (fun arg1 x)) lst))
(let ((cval (get-come-calc x)))
  (map (lambda (x) (list 1 cval x)) (get-list)))
但是你真的想这样做
(cmap列表1(获取一些计算x)(获取列表))
,但是要让它接受任何一个curred参数是非常困难的,也许你想要不止一个列表。你是这样做的:

(define (cmap fun arg1 lst)
  (map (lambda (x) (fun arg1 x)) lst))
(let ((cval (get-come-calc x)))
  (map (lambda (x) (list 1 cval x)) (get-list)))

否,
double
需要在
func
之外,因为它将作为参数(绑定到
f
)传递到
func

(define (func f n lst)
  (do ((n n (sub1 n))
       (lst lst (map f lst)))
      ((zero? n) lst)))
(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))
然后


OTOH,在这种情况下,
时间可以在
func
内部定义,但它是一个可重用的过程,所以我将它留在外部。

不,
double
需要在
func
外部,因为它将作为参数(绑定到
f
)传递到
func

(define (func f n lst)
  (do ((n n (sub1 n))
       (lst lst (map f lst)))
      ((zero? n) lst)))
(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))
然后


OTOH,在这种情况下,
时间
可以在
func
内部定义,但它是一个可重用的过程,所以我把它放在外部。

你能让你的问题更清楚吗?你能让你的问题更清楚吗?有趣的是,将你的方法与我的方法进行比较和对比:你用一个函数映射一次,这个函数可以重复,而我使用原始函数多次映射。:-)观察得不错。重读OP的问题,我想我们都忘了回答如何定义double:-)我们把重点放在func上。好吧,如果你更直截了当地阅读这个问题,OP想定义
func
,想知道
double
是否必须在其中定义。答案当然是否定的,正如两个答案所表明的那样。将您的方法与我的方法进行比较和对比很有趣:您使用一个重复的函数映射一次,而我使用原始函数映射多次。:-)观察得不错。重读OP的问题,我想我们都忘了回答如何定义double:-)我们把重点放在func上。好吧,如果你更直截了当地阅读这个问题,OP想定义
func
,想知道
double
是否必须在其中定义。答案当然是否定的,正如两个答案所表明的那样。你可以将符号
'double
作为消息传递进来,并有一个内部分派和定义,特别是如果func要保持任何类型的内部状态。我不明白内部分派的意义,很抱歉,如果
func
具有某种状态,我认为没有必要这样做。你能详细说明一下吗?如果你保留一个内部分派表或列表,你可以避免名称空间冲突,同时保留一种扩展可用功能的方法,比如将函数扩展为双字符串,或者将任何内部函数应用于树和向量。也许您希望在每次传入某个消息时增加一个计数器。是的,这里可能不需要这样做,但消息传递非常有用。您可以将符号
'double
作为消息传入,并且有一个内部分派和定义,特别是如果func要保持任何类型的内部状态。我看不出内部分派的意义,很抱歉,如果
func
有某种状态,我看不到这样做的必要性。你能详细说明一下吗?如果你保留一个内部分派表或列表,你可以避免名称空间冲突,同时保留一种扩展可用功能的方法,比如将函数扩展为双字符串,或者将任何内部函数应用于树和向量。也许您想在每次传入某个消息时增加一个计数器。是的,这里可能不需要什么,但消息传递非常有用。