3

我目前正在学习计划,我遇到了这些功能:

(define t (lambda (x) (lambda (y) x))) 
(define f (lambda (x) (lambda (y) y))) 

显然,它们是将真假表示为函数。我不知道为什么!

我有两个问题:

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

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

通过调用,(add 1 5)我将被提供6为输出。

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

4

3 回答 3

7

这里发生的事情被称为柯里化 - 转换一个接受 n 个多个参数的函数,使其可以被称为函数链

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

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

让我们考虑一个 curried-add 函数:

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

((curried-add 1) 5)

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

我们可以将这些 curried-add 链接在一起以获得:

((curried-add ((curried-add 1) 2)) 3)

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

在这种情况下,您的真假功能。

真实的是:(define t (lambda (x) (lambda (y) x)))

错误的是:(define f (lambda (x) (lambda (y) y)))

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

于 2013-01-03T20:57:04.393 回答
2

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

在数学和计算机科学中,柯里化是一种转换具有 n 个多个参数(或参数的 n 元组)的函数的技术,它可以被称为函数链,每个函数都有一个参数(部分应用)。它由 Moses Schönfinkel 发起,后来被 Haskell Curry 重新发现

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

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

true ≡ λa.λb. a
false ≡ λa.λb. b
于 2013-01-03T21:19:53.137 回答
1

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

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

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

于 2013-01-03T20:51:25.737 回答