【发布时间】:2016-08-16 11:43:40
【问题描述】:
好的,所以我正在尝试实现basics of lambda calculus。就这样吧。
我的号码:
def zero[Z](s: Z => Z)(z: Z): Z = z
def one[Z](s: Z => Z)(z: Z): Z = s(z)
def two[Z](s: Z => Z)(z: Z): Z = s(s(z))
它们的部分(实际上,非)应用版本是这样的:
def z[Z]: (Z => Z) => (Z => Z) = zero _
在我继续之前,我定义了一些类型:
type FZ[Z] = Z => Z
type FFZ[Z] = FZ[Z] => FZ[Z]
好的,succ 函数是这样的(应用程序顺序应该完全那样!我接受了here的定义):
def succ[Z](w: FFZ[Z])(y: FZ[Z])(x: Z): Z = y((w(y))(x))
它的未应用版本变得如此可怕:
def s[Z]: FFFZ[Z] = successor _
请原谅,这里是缺少的类型:
type FFFZ[Z] = FFZ[Z] => FFZ[Z]
type FFFFZ[Z] = FFFZ[Z] => FFFZ[Z]
但我卡在add 函数上。如果符合类型和定义(也采用here),它就像
def add[Z](a: FFFFZ[Z])(b: FFZ[Z]): FFZ[Z] =
(a(s))(b)
但我希望a 是FFZ[Z] 类型的常见数字。
那么——我该如何定义加法?
【问题讨论】:
-
我的第一个猜测是它只适用于无类型的 lambda 演算,其中 value 只是 somehting 而 function 是从 something 到 某事所以我可以调用函数
f,其参数类型是a: Z -> Z,它可能不完全符合我应用的函数f': (Z -> Z) -> (Z -> Z)。 -
也许像“在 Scala 中添加教堂数字”这样的标题会更准确一些。
标签: scala lambda-calculus church-encoding