将 lambda 函数传递给 Scheme 中的 lambda 函数
Passing a lambda function to a lambda function in Scheme
所以我有一个小挑战。
我想在这里编程:
使用 lambda 演算可以简化为 12。
我有以下 Scheme 脚本:
(
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)
所以我当然认为'这是因为 double 的参数是一个列表而不是数字'但是 car y
只是将终端输出的最后一行更改为 3
.
我想我对 Racket
终端输出的解释有误,但我不知道是哪一种。然而,还有另一种可能性,即不允许将 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 演算可以简化为 12。
我有以下 Scheme 脚本:
(
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)
所以我当然认为'这是因为 double 的参数是一个列表而不是数字'但是 car y
只是将终端输出的最后一行更改为 3
.
我想我对 Racket
终端输出的解释有误,但我不知道是哪一种。然而,还有另一种可能性,即不允许将 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
。