【发布时间】:2012-01-06 10:03:23
【问题描述】:
当添加baz 的类型声明时,此代码会中断:
baz (x:y:_) = x == y
baz [_] = baz []
baz [] = False
一个常见的解释(参见Why can't I declare the inferred type? 的例子)是因为多态递归。
但这种解释并不能解释为什么在另一个多态递归示例中效果会消失:
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]?
【问题讨论】:
标签: haskell types recursion polymorphism monomorphism-restriction