如何在DrRacket方案中使用lambda

如何在DrRacket方案中使用lambda,lambda,scheme,Lambda,Scheme,我想问你能否帮我做一个编程练习。我正试图用一个lambda表达式来表示这种形式: λz.x(yz) 我的理解是,y是一个函数,应用于值z。如果函数y应用于z,则x是应用于输出的函数。整个表达是这样的: λz.x(yz) means: Do the following with the argument z: 将功能y应用于z 将功能x应用于第一个过程中产生的内容 我制作此程序是为了让Scheme实现上述所有功能: (define (zlamb) (lambda (z) (lamb

我想问你能否帮我做一个编程练习。我正试图用一个lambda表达式来表示这种形式:

λz.x(yz)
我的理解是,
y
是一个函数,应用于值
z
。如果函数
y
应用于
z
,则
x
是应用于输出的函数。整个表达是这样的:

λ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


    我在互联网上到处寻找解释,但在大海捞针中找不到具体的针

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

    (* z 4)
    
    z
    乘以4

    (lambda (y) (* z 4))
    
    返回
    z*4

    (* (lambda (y) (* z 4)) 2)
    
    该函数与2的乘积。一个函数不能乘以2。 这可能是导致您的bug的原因;也许您的意思是要执行以下操作:

    (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行中的匿名函数称为第3行中的
    y
    ,是因为

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

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

    阿拉芬威所说的一切对我来说都很有意义。然而,我仍然担心你可能误解了你的任务

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

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


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

    非常感谢Arafinwe,它的工作非常有魅力。通过使用((zlamb)3)调用它,结果是预期的24。您已经很好地解释了如何嵌套lambda定义。在我的作业中,我必须做更深入的嵌套,但我相信我已经有了这个想法。如果事实证明我还没有,“我会回来的”,用一句名言@奥多诺尔科维斯特没问题!顺便说一句,如果您想以正常方式创建函数,正确的语法是
    (define(zlamb z)…)
    (define zlamb(z)…)
    。然后,您可以通过执行
    (zlamb 3)
    而不是
    ((zlamb)3)
    来调用该函数。最后,如果您发现答案有帮助,您可以单击答案旁边的复选标记轮廓和“向上”按钮。这让人们知道这个问题已经被这个答案回答了。当我的声望达到15分时,我会投赞成票,再次感谢。我已经接受了答案,但这是否意味着当我明天尝试进行更深的筑巢并遇到麻烦时,我必须问另一个问题?只有当你尝试去应用它,或者失败或者成功的时候,你才知道你是否理解它@如果你有另一个问题,你当然可以问另一个问题。但是,如果有可能将问题归纳为一个问题,我将代码改为使用定义而不是lambda,因为lambda应该只用于Z-PART。λz.x(yz)的等价性如下所示,在最后一行用一个参数调用。现在唯一剩下的问题是将其嵌套得更深,首先是λy.(λz.x(yz)),然后是λx.(λy.(λz.x(yz)))。有人知道如何把段落分成几段吗?我担心的是同一件事,因为我在第一篇评论中提到了这一点。我一直在想,如果我用lambda表示x和y,是不是做错了什么。我很确定yz意味着将函数y应用于z,x(yz)意味着将函数x应用于yz。所以你是说我必须使用(定义z(函数性这个或那个))才能进行调用(zx)?是的,没错;您提供的lambda演算术语有自由变量引用,除非在绑定这些变量的上下文中,否则无法对其求值。谢谢您,John,很抱歉,我混淆了变量。。。(定义y(??)以便能够拨打电话(y z)…-这是我应该写的。我想我离理解lambda微积分有点近了。