わかりましたので、ラムダ計算の基本を実装しようとしています。ここに行きます。
私の番号:
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]
。
では、足し算はどのように定義すればよいのでしょうか?