2012-09-19 41 views
4

我想问问你是否可以帮助我进行编程练习。我试图使这种形式的lambda表达式:如何在DrRacket Scheme中使用lambda

λz.x(yz) 

我明白这个问题的方法,是y是一个函数,应用到价值z。然后x是应用于如果功能y被应用于z时出现的功能。然后整个表达式这样说:

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

我做了这个计划,试图让计划做上述所有的:

(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

我在互联网上搜索了所有的解释,但无法找到我在干草堆中寻找的特定针。

回答

1

让我们打破你的程序下来从内到外:由4

(lambda (y) (* z 4)) 

函数返回z*4

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

该功能的产品和2

(* z 4) 

z 。你不能乘以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 s结尾起来是相同的,因为z2势必会在第3行的z的价值,他们其实可以两个被命名为z但我用不同的名字来防止混淆。

它还看来,你的基本问题是与它的参数混淆函数的名称:

(lambda (name) ...) 

说法name创建匿名功能。我们之所以能够参考匿名函数在第4行作为y在第3行是通过使结构

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

其中通过第二函数作为参数传递给第一,从而将其命名为y

+0

非常感谢Arafinwe,工作就像一个魅力。通过((zlamb)3)调用它,结果如预期的那样为24。你已经解释了如何嵌套lambda定义。在我的任务中,我必须做更深入的嵌套,但我相信我有这个想法。如果事实证明我没有,“我会回来”,使用一个着名的报价! – TheodorN

+0

@TheódórNorðkvist没问题!顺便说一句,如果你想以正常的方式创建函数,那么正确的语法是'(define(zlamb z)...)'或'(define zlamb(lambda(z)...))''。然后,您可以通过执行'(zlamb 3)'而不是'((zlamb)3)'调用该函数。最后,如果您发现答案有帮助,则可以单击答案旁边的复选标记轮廓以及“向上”按钮。这让人们知道这个问题已经被这个答案回答了。 – ikdc

+0

当我得到15的声望时会投票,再次感谢。我已经接受了答案,但这是否意味着当我试图明天进行更深层次的嵌套并遇到麻烦时,我必须提出另一个问题?你只知道你是否了解某些东西,当你尝试应用它时,或者失败或成功! – TheodorN

2

一切Arafinwe说让我感觉良好。但是,我仍然担心你可能会误解你的任务。

更具体的演算基本上是计划条款的一个子集,具有非常稍微不同的语法。特别是lambda演算术语λz。在Scheme中被写为(lambda(z))。那么,还有必须翻译的警告。

中的应用(ZX)被写入在方案简称为(Z x)的。另外,数学家是懒惰的,他们有时候会舍弃父亲,所以a(bc)实际上是(a(bc))的简写。我努力不直接翻译你的术语,这里:)。

但是请注意,你给演算项为计划的直接转换将不会是一个结构良好的程序,因为它包含自由引用(“绑定变量”)y和z。

+0

我担心的是完全一样的事情,因为我在我的第一个评论中被捕。我一直在想,如果我通过使用lambda表示x和y而做错了什么。我很确定yz表示将函数y应用于项z,x(yz)表示将函数x应用于yz。所以你说我必须使用(定义z(functionlity这个或那个))才能打电话(z x)? – TheodorN

+0

是的,没错。您提供的lambda-演算术语具有自由变量引用,除了绑定这些变量的上下文外,不能评估它们。 –

+0

谢谢约翰,对不起,我混淆了变量。 ...(定义y(??))能够进行呼叫(y z)... - 是我应该写的。认为我更接近理解这个lambda演算。 – TheodorN