1

假设我得到了表达式(我将 l 称为 lambda):

lx.f1 f2 x

其中 f1 和 f2 是函数,x 假设为某个数字。

你如何解释这个表达?lx.(f1 f2) x 和 lx.f1 (f2 x) 一样吗?

例如,lx.(not eq0) x 和 lx.not (eq0 x) 的结果会有什么不同?(eq0 是一个函数,如果 parm 等于 0 并且 not 是众所周知的 not 函数,则返回 true )

更正式地说 T=lx.ly.x ,F=lx.ly.y ,not = lx.xFT 和 eq0 = lx.x(ly.F)T

4

1 回答 1

2

f1 f2 x是一样的(f1 f2) x。函数应用是左关联的。

ln.(f1 f2) x 是否与 ln.f1 (f2 x) 相同?

一点都不。(f1 f2) x调用f1withf2作为其参数,然后调用结果函数x作为其参数。f1 (f2 x)调用f2withx作为它的参数,然后调用f1它的结果f2 x作为它的参数。

ln.(not eq0) x 和 ln.not (eq0 x)?

如果我们谈论的是类型化的 lambda 演算并not期望布尔值作为参数,则前者只会导致类型错误(因为eq0是函数而不是布尔值)。如果我们谈论的是无类型的 lambda 演算,true并且false表示为函数,它取决于如何not定义以及如何表示truefalse表示。

如果truefalse是 Church 布尔值,即true是一个返回其第一个参数false的双参数函数,并且是一个返回其第二个参数的双参数函数,则not等价于该flip函数,即它接受一个双参数函数并返回一个二-argument 函数,其参数已被反转。所以(not eq0) x将返回一个函数,当应用于其他两个参数yz时,将评估为((eq0 y) x) z。所以如果y为 0,则返回x,否则返回z

于 2013-02-03T18:46:36.720 回答