在scheme中使用多个lambda意味着什么?

在scheme中使用多个lambda意味着什么?,lambda,functional-programming,scheme,currying,lambda-calculus,Lambda,Functional Programming,Scheme,Currying,Lambda Calculus,我目前正在学习该计划,我遇到了以下功能: (define t (lambda (x) (lambda (y) x))) (define f (lambda (x) (lambda (y) y))) 显然,它们是真与假函数的表示。我不知道为什么 我有两个问题: 1) 连续的lambda是什么意思?我只习惯于看到一个lambda,用于将参数传递给函数;i、 e (define add (lambda (x y) (+ x y))) 通过调用(add15)我将获得6作为输出 2)

我目前正在学习该计划,我遇到了以下功能:

(define t (lambda (x) (lambda (y) x))) 
(define f (lambda (x) (lambda (y) y))) 
显然,它们是真与假函数的表示。我不知道为什么

我有两个问题:

1) 连续的lambda是什么意思?我只习惯于看到一个lambda,用于将参数传递给函数;i、 e

(define add
  (lambda (x y)
    (+ x y)))
通过调用
(add15)
我将获得
6
作为输出


2) 如何使用这些真函数和假函数?

它们是函数,当使用1个参数调用时,将返回另一个函数。所以你可以这样称呼他们-

(define v (some expression that returns t or f))
((v 'foo) 'bar) ; ==> foo if v is t, bar if v is f

这有点像
(如果v'foo'bar)
,带有普通的内置布尔值。在简单的lambda演算中,它经常被用来对真/假进行编码。

这里发生的事情被称为-转换一个函数,该函数接受n个多参数,这样它就可以被称为一个函数链

让我们考虑一个函数f,它取2个参数,即f(x,y)。存在一元函数g,使得f(x,y)=g(x)(y)=(g(x))(y)。函数g被称为f的当前版本

g是一个需要一个参数(x)的函数,g(x)的值也是一个参数y的函数

让我们考虑一个CurryAdd函数:

(define curried-add 
  (lambda (x) 
    (lambda (y) (+ x y))))

((curried-add 1) 5)
调用(curried add 1)将返回一个函数,该函数接受一个参数,在我们的示例5中,将其添加到1,并给出6的输出

我们可以将这些咖喱添加链接在一起,以获得:

((curried-add ((curried-add 1) 2)) 3)
将产生6的产量。这是因为(curry add 1)将返回一个需要一个参数的函数,在本例中为2。因此,将1添加到2并生成一个函数,该函数需要一个参数,该参数可以添加到我们刚刚创建的3中

在这个例子中,你的真函数和假函数

真的是:
(定义t(λ(x)(λ(y)x))

False是:
(定义f(λ(x)(λ(y)y))

true函数接受两个参数并返回第一个参数false函数
返回两个参数中的第二个。

正如@Hayden在回答中指出的,连续的lambda是一个示例,本质上只是一个返回另一个函数的函数:

(define curried-add 
  (lambda (x) 
    (lambda (y) (+ x y))))

((curried-add 1) 5)
在数学和计算机科学中,curry是一种转换函数的技术,该函数具有n个多参数(或n个参数元组),可以将其称为函数链,每个函数具有一个参数(部分应用)。它起源于摩西·舍芬克尔,后来被哈斯克尔·库里重新发现

关于问题的第二部分:布尔值可以被编码为函数,它是在中使用的真值的表示,请参阅链接以了解它们的使用方式:

Church boolean是布尔值true和false的Church编码。一些编程语言使用它们作为布尔运算的实现模型;例如Smalltalk和Pico。布尔值表示为两个值的函数,这两个值的计算结果为它们的一个或另一个参数。lambda演算中的形式定义: