我想问你是否可以帮助我进行编程练习。我正在尝试制作这种形式的lambda表达式:
λz.x(yz)
我理解这一点的方式是,y
是一个函数,应用于值z
。然后x
是一个函数,应用于函数y
应用于z
时出现的函数。整个表达然后说:
λz.x(yz) means: Do the following with the argument z:
y
应用于z
。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
。
我在互联网上搜索了解释,但找不到我在大海捞针中寻找的特定针。
答案 0 :(得分:2)
Arafinwe所说的一切对我来说都很有意义。但是,我仍然担心你可能会误解你的任务。
更具体地说,lambda演算本质上是方案术语的子集,语法略有不同。特别地,λ演算项λz。在Scheme中写为(lambda(z))。好吧,还有必须翻译的警告。
应用程序(zx)在Scheme中简单地用(z x)编写。此外,数学家是懒惰的,他们有时会遗漏parens,所以(bc)实际上是(a(b c))的简写。我在努力不直接翻译你的学期,在这里:)。
请注意,将给定的lambda演算术语直接转换为Scheme将不是一个格式良好的程序,因为它包含自由引用(“未绑定的变量”)y和z。
答案 1 :(得分:1)
让我们从内到外打破你的程序:
(* z 4)
将z
乘以4
(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)))))
首先请注意,z
最终都是相同的,因为z2
绑定到第3行中z
的值。事实上它们都可以命名为{{ 1}}但我用不同的方式命名它们以防止混淆。
进一步看来,你的基本问题是将函数的名称与其参数混淆:
z
使用(lambda (name) ...)
的参数创建匿名函数。我们能够将第4行中的匿名函数称为第3行name
的原因是构建
y
将第二个函数作为参数传递给第一个函数,从而将其命名为((lambda (y) ...) (lambda ...))
。