好的,所以我試圖實現basics of lambda calculus。在這裏。斯卡拉lambda微積分
我的號碼:
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 *到* something *的映射,所以我可以調用參數類型爲「a:Z - > Z」的函數f可能並不完全符合一個函數'f':(Z - > Z) - >(Z - > Z)'我應用它。 – zapadlo
也許像「斯卡拉教會數字的添加」這樣的標題會更精確一些。 –