在计划中使用多个lambdas意味着什么?

时间:2013-01-03 19:29:09

标签: lambda functional-programming scheme currying lambda-calculus

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

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

显然,它们是真假的功能。我不明白为什么!

我有两个问题:

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

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

通过致电(add 1 5),我将获得6作为输出。

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

3 个答案:

答案 0 :(得分:7)

这里发生的事情被称为currying - 转换一个函数,该函数以一种可以被称为函数链的方式获取多个参数

让我们考虑一个带有2个自变量的函数f,即f(x,y)。存在一元函数g,使得f(x,y)= g(x)(y)=(g(x))(y)。函数g被称为f的 curried 版本。

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 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函数 返回两个参数中的第二个。

答案 1 :(得分:2)

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

  

在数学和计算机科学中,currying是一种转换函数的技术,该函数采用n个多个参数(或n元组参数),使得它可以被称为函数链,每个函数都有一个论证(部分申请)。它起源于MosesSchönfinkel,后来由Haskell Curry重新发现

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

  

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

true ≡ λa.λb. a
false ≡ λa.λb. b

答案 2 :(得分: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演算中编码真/假。