我正在尝试实现一个简单类型的 lambda 演算类型检查器。在运行健全性测试时,我尝试输入 (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