如何在DrRacket Scheme中使用lambda

时间:2012-09-19 23:48:58

标签: lambda scheme

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

λz.x(yz)

我理解这一点的方式是,y是一个函数,应用于值z。然后x是一个函数,应用于函数y应用于z时出现的函数。整个表达然后说:

λz.x(yz) means: Do the following with the argument z:
  1. 将功能y应用于z
  2. 将函数x应用于第一个过程中的内容。
  3. 我已经制作了这个程序,试图让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

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

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 ...))