我目前正在学习计划,我遇到了这些功能:
(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)如何使用这些真假函数?
答案 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 booleans中lambda 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演算中编码真/假。