教堂减法
Lambda演算一直是我的迷恋,并且将函数相互传递的新出现的行为令人愉快地复杂。教堂数字是自然数的表示,该自然数是由函数的重复应用构成的(通常是常数的一元加法)。例如,数字零返回x并“忽略”输入函数,一个为f(x)
,两个为f(f(x))
,依此类推:
ident = lambda x: x
zero = lambda f: ident
succ = lambda n: lambda f: lambda x: f(n(f)(x))
one = succ(zero)
add1 = lambda x: x + 1
to_int = lambda f: f(add1)(0)
print(to_int(one))
>>> 1
由此我们可以很容易地看到,通过将第一个函数应用于x然后将第二个函数应用于x可以完成加法运算:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
加法相对容易理解。但是,对于新手来说,想像一下教堂编码数字系统中的减法可能是不可想象的。取消应用功能可能意味着什么?
挑战
在教堂编码数字系统中实现减法功能。如果结果将大于零,则减法执行monus运算,并且不应用函数n
时间,否则将大于零。这是代码高尔夫球,因此最短的代码获胜。
输入值
您选择的语言中已编码的两个教堂数字。输入可以是位置输入或咖喱输入。为了证明这些是真实的教堂数字,它们将必须具有任何功能并反复应用它们(add1
在示例中给出,但可能是add25
,mult7
或任何其他一元函数)。
输出量
教堂数字。应当注意的是,如果m < n
然后m - n
总是一样的身份功能。
例子:
minus(two)(one) = one
minus(one)(two) = zero
...
也可以接受:
minus(two, one) = one
minus(one, two) = zero
信用:
这个github要点是为我提供了Church Numerals的python实现。
lambda m,n,f:apply f m-n times
(甚至lambda m,n,f,x:apply f m-n times to x
)而不是lambda m,n:lambda f:...
?还是这仅适用于两个输入m
和n
?
m
并n
在另外的顺序?这将有助于咖喱。
exp(m, n)
计算出来m^n
的。)