在Scheme中将lambda函数传递给lambda函数
所以我有一个小小的挑战 我试图在这里编程: 用lambda演算简化为12 我有以下方案脚本:在Scheme中将lambda函数传递给lambda函数,scheme,lambda-calculus,Scheme,Lambda Calculus,所以我有一个小小的挑战 我试图在这里编程: 用lambda演算简化为12 我有以下方案脚本: ( define double ( lambda x ( + (car x) (car x) ) ) ) (display 'Debug) (newline) (display (double 6)) (newline) ( define getTwelve ( (( (la
(
define double (
lambda x (
+ (car x) (car x)
)
)
)
(display 'Debug)
(newline)
(display (double 6))
(newline)
(
define getTwelve (
((
(lambda x (
lambda y (
(display y)
(newline)
(x (x y))
)
))
double
) 3)
)
)
(display getTwelve)
(newline)
(newline)
与此终端输出相对应的:
Debug
12
(3)
application: not a procedure;
expected a procedure that can be applied to arguments
given: '(#<procedure:double>)
arguments...:
'(3)
调试
12
(3)
应用:不是一个程序;
应为可应用于参数的过程
给定:'(#)
论据。。。:
'(3)
所以我当然认为‘这是因为double的参数是一个列表而不是一个数字’,但是cary
只是将终端输出的最后一行更改为3
我想我把拍子
终端输出解释错了,但我不知道用哪种方式。但是,不允许将lambda
函数作为参数传递到lambda
函数中
所以我的问题是:它是哪一个?通常
lambda
后面的参数列表应该是一个变量列表。如果希望允许过程中的参数数量可变,则只能使用一个不带列表的变量,这里的情况并非如此。如果这样做,每个变量都将绑定到连续的参数,并且不需要使用car
来获取参数的值。因此,它应该是:
(define double
(lambda (x)
(+ x x)))
如果使用getTwelve
执行此操作,您应该会得到预期的结果
(define getTwelve
((((lambda (x)
(lambda (y)
(display y)
(newline)
(x (x y))))
double) 3)))
在最里面的lambda
的主体周围还有一组额外的括号
不要在
后面加换行和缩进(
。这是非常不寻常的方案风格。注意。我用它来区分lambda上的定义和执行,但你完全正确。:)