添加类型声明时,此代码会中断baz
:
baz (x:y:_) = x == y
baz [_] = baz []
baz [] = False
一个常见的解释(参见Why can't I declare the inferred type? for example)是因为多态递归。
但是这种解释并不能解释为什么效果会随着另一个多态递归示例而消失:
foo f (x:y:_) = f x y
foo f [_] = foo f []
foo f [] = False
它也没有解释为什么 GHC 认为没有类型声明的递归是单态的。
可以将http://www.haskell.org/onlinereport/decls.html#sect4.5.5中的示例解释reads
应用于我的案例吗?baz
即添加签名消除了单态性限制,并且没有限制,右侧 [] 出现歧义,“固有歧义”类型为forall a . Eq a => [a]
?