4

我想问你是否可以帮助我进行编程练习。我正在尝试制作这种形式的 lambda 表达式:

λz.x(yz)

我理解这一点的方式是,它y是一个函数,应用于 value z。然后x是一个函数,如果该函数y应用于z. 然后整个表达式是这样说的:

λz.x(yz) means: Do the following with the argument z:
  1. 将函数y应用于z.
  2. 将该函数x应用于第一个过程的结果。

我制作了这个程序来尝试让 Scheme 完成上述所有操作:

(define (zlamb)
  (lambda (z)
    (lambda (x)
      (* (lambda (y) (* z 4)) 2))))

当我运行它时,我得到的只是:

Welcome to DrRacket, version 5.3 [3m].
Language: R5RS; memory limit: 128 MB.
( (zlamb) 3)
procedure:...lambdaefing1.rkt:3:4
>

有人可以向我解释我做错了什么吗?我想要得到的是(3 * 4) * 2 = 24. 所以我做了(或认为我做了)内部函数y = z * 4和外部函数x = y(z) * 2

我在互联网上搜索了所有解释,但在大海捞针中找不到我正在寻找的特定针。

4

2 回答 2

2

Arafinwe 所说的一切对我来说都非常有道理。但是,我仍然担心您可能会误解您的任务。

更具体地说,lambda 演算本质上是方案术语的子集,语法略有不同。特别是 lambda 演算项 λz。在 Scheme 中写为 (lambda (z) )。好吧,需要注意的是也必须翻译。

应用程序 (zx) 在 Scheme 中简单地写为 (zx)。此外,数学家很懒惰,他们有时会省略括号,所以 a(bc) 实际上是 (a (bc)) 的简写。我正在努力不直接翻译你的术语,在这里:)。

但是请注意,将给定的 lambda 演算项直接翻译成 Scheme 将不是一个格式良好的程序,因为它包含自由引用(“未绑定变量”)y 和 z。

于 2012-09-20T03:23:27.560 回答
1

让我们从内到外分解您的程序:

(* z 4)

乘以z4

(lambda (y) (* z 4))

一个函数返回z*4

(* (lambda (y) (* z 4)) 2)

该函数和 2 的乘积。您不能将函数乘以 2。这可能是导致您的错误的原因;也许您的意思是执行以下操作:

(define (zlamb)
  (lambda (z)
    ((lambda (y) (* 2 (y z))) ; Note the two parenthesis before lambda - this is a function application
      (lambda (z2) (* z2 4)))))

首先请注意,两个zs 最终是相同的,因为z2绑定到第z3 行的值。实际上它们都可以命名z,但我以不同的方式命名它们以防止混淆。

进一步看来,您的基本问题是将函数名称与其参数混淆:

(lambda (name) ...)

创建一个参数为的匿名函数。我们能够像在第 3 行中那样引用第 4 行中的匿名函数的原因是通过构造namey

((lambda (y) ...) (lambda ...))

它将第二个函数作为参数传递给第一个函数,从而将其命名为y

于 2012-09-20T00:12:00.250 回答