好的,所以我正在尝试实现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
功能是这样的(应用程序顺序应该完全一样!我在这里定义了):
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
功能上。如果符合类型和定义(也采用此处),它就像
def add[Z](a: FFFFZ[Z])(b: FFZ[Z]): FFZ[Z] =
(a(s))(b)
但我想a
成为一个普通的数字类型FFZ[Z]
。
那么 - 我如何定义加法?