我们来看看以下功能:
(define Increment1 (λ(x)(+ x 1)))
(define (Increment2)
(define (inc2 x)(+ x 1))
inc2)
它们都返回增加x的函数。
问题1: 鉴于代码:
(define Func Increment2)
(Func 2)
为什么会出错? (预期参数数量= 0,给定= 1), 而代码
(define Func2 (Increment2))
(Func2 2)
会起作用并会返回3.为什么会这样?
问题2:为什么在使用lambda定义函数时,我们不需要用括号包装它? (案例增量1) 另一方面,为什么我们在不使用lambda时用括号包装函数名? (案例增量2)
问题3:让我们定义一个函数(define Func3 (λ(F x)(F x)))
。
为什么(Func3 Increment1 2)
会起作用,但(Func3 Increment2 2)
会失败? (与问题1中的错误相同)。
谢谢。
答案 0 :(得分:1)
Increment2
是一个返回值为函数的函数。因此,您需要调用Increment2
来获取其返回值,这是一个函数。
查看你的第二个清单:
(define Func2 (Increment2))
(Func2 2)
我们注意到Func2
是Increment2
的返回值,它是一个函数。因此你可以打电话给它。所以Increment2
指向一个带0个参数的函数,但是调用它会返回一个带有一个参数的函数。
-
对于你的第二个问题,lambda是一个匿名函数。所以(define Func3 (λ(F x)(F x)))
是一个变量定义,你将变量Func3
绑定到一个匿名函数,因此,你命名它,它将作为一个常规函数。
事实上,您刚刚发现(define (fun args) ...)
语法是用于将变量绑定到匿名函数的语法糖。
-
关于你的第三个问题,如果你理解我对第一个问题的回答,你应该能够回答它。