为什么这两个问题的结果相同?

时间:2016-03-16 18:30:24

标签: racket

  1. ((lambda(proc)(proc“yes”“no”))(lambda(a b)a));;是

  2. ((lambda(a b)a)“是”“否”);;是

  3. 我的问题是为什么1和2具有相同的结果并且它们是否相同? 有人可以说清楚一点吗?

1 个答案:

答案 0 :(得分:1)

他们给出相同的结果,但他们不是“相同”。它们是两种恰好产生相同结果的语言结构(嗯,是的,在功能世界中,它们是等价的,但我不认为你是指那个。)

真的,了解这些结构会让人理解语言本身(Scheme)。我可以给你一些提示。

粗略地说,构造(X Y)意味着“功能应用”。也就是说,第一个X是一个函数,Y是一个参数或一组参数。然后使用X参数调用函数Y

拿你的第二行,例如,你可以看到,分解它,它有:

(<Function> "yes" "no")

即可能是一个函数,然后是两个参数。在Scheme中,您可以构建没有名称的匿名函数,但是您可以指定它们期望作为参数的内容以及它们在调用时执行的操作。这被称为“lambda函数”。在您的情况下,lambda函数定义为:

(lambda (a b) a)

即,没有名称的函数接受两个参数ab并返回第一个参数。如果你把所有这些放在一起,你得到

((lambda (a b) a) "yes" "no")

显然它是一个函数应用程序,它返回传递的第一个参数,因为lambda函数会这样做。

第一种情况类似,但在这种情况下,函数本身作为参数传递。你有:

(<Function> (lambda (a b) a))

这个Function接受可以用来构建应用程序表达式并产生结果的“东西”:

(lambda (proc) (proc "yes" "no"))

即接受一些函数proc,并用两个参数“调用”它。请注意,您传递的函数(lambda (a b) a)接受两个参数并返回第一个参数,因此它再次生成"yes"