【问题标题】:Passing a lambda function to a lambda function in Scheme将 lambda 函数传递给 Scheme 中的 lambda 函数
【发布时间】:2018-09-14 19:05:37
【问题描述】:

所以我有一点挑战。

我正在尝试在这里编程:

使用 lambda 演算可以简化为 12。

我有以下方案脚本:

(
    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 函数。

所以我的问题是:它是哪一个?

【问题讨论】:

  • 不要在( 之后添加换行符和缩进。这是非常不寻常的 Scheme 风格。
  • 注明。我用它来区分 lambda 上的定义和执行,但你是完全正确的。 :)

标签: scheme lambda-calculus


【解决方案1】:

通常lambda之后的参数列表应该是变量列表。如果您想允许过程的参数数量可变,则只能使用没有列表的单个变量,这里不是这种情况。如果这样做,每个变量都将绑定到连续的参数,您不需要使用car 来获取参数的值。所以应该是:

(define double
    (lambda (x) 
        (+ x x)))

如果您使用getTwelve 执行此操作,您应该会得到您期望的结果。

(define getTwelve
  ((((lambda (x)
       (lambda (y)
         (display y)
         (newline)
         (x (x y))))
     double) 3)))

在最里面的lambda 的主体周围还有一组额外的括号。

DEMO

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多