说我得到了表达式(我将l称为lambda):
lx.f1 f2 x
其中f1和f2是函数,x假设为某个数字。
你怎么解释这个表达?是lx。(f1 f2)x与lx.f1(f2 x)相同?
作为一个例子,lx。(不是eq0)x和lx.not(eq0 x)的结果会有什么差异? (eq0是一个函数,如果parm等于0则返回true,而不是众所周知的not函数)
更正式地说T = lx.ly.x,F = lx.ly.y,not = lx.xFT和eq0 = lx.x(ly.F)T
答案 0 :(得分:2)
f1 f2 x
与(f1 f2) x
相同。函数应用程序是左关联的。
是ln。(f1 f2)x与ln.f1(f2 x)相同?
不,一点也不。 (f1 f2) x
以f1
为参数调用f2
,然后以x
为参数调用生成的函数。 f1 (f2 x)
以f2
为参数调用x
,然后调用f1
,其结果为f2 x
。
ln。(不是eq0)x和ln.not(eq0 x)?
如果我们讨论的是类型化的lambda演算,not
期望布尔值作为参数,前者只会导致类型错误(因为eq0
是函数而不是布尔值)。如果我们讨论的是无类型的lambda演算,true
和false
表示为函数,则取决于not
的定义方式以及true
和{{1}的方式代表。
如果false
和true
是教会布尔值,即false
是一个双参数函数,它返回其第一个参数,而true
是一个双参数函数,它返回它的第二个参数,然后false
等同于not
函数,即它采用双参数函数并返回一个双参数函数,其参数已被反转。因此,flip
将返回一个函数,当应用于其他两个参数(not eq0) x
和y
时,它将评估为z
。因此,如果((eq0 y) x) z
为0,则会返回y
,否则为x
。