単純に型指定されたラムダ計算型チェッカーを実装しようとしています。サニティ テストを実行しているときに (SKK) と入力しようとすると、型チェッカーが次のエラーをスローします。
TypeMismatch {firstType = t -> t, secondType = t -> t -> t}
問題のある用語は明らかに(SKK)です
(\x:t -> t -> t.\y:t -> t.\z:t.x z (y z)) (\x:t.\y:t.x) (\\x:t.\y:t.x)
この Haskell コードをタイプチェックすると正常に動作するため、ポリモーフィズムの欠如から問題が発生すると思います。
k x y = x
s x y z = x z (y z)
test = s k k -- type checks
しかし、私がタイプを特化した場合:
k :: () -> () -> ()
k x y = x
s :: (() -> () -> ()) -> (() -> ()) -> () -> ()
s x y z = x z (y z)
test = s k k -- doesn't type check
参考までに、私の型システムは次のように単純です。
data Type = T | TArr Type Type