Haskell奇怪的类型推断缩小

时间:2015-02-27 10:41:49

标签: haskell ghc type-inference ghci

GHCi 7.8.3

filter (\(a,b) -> a>0) :: (Ord a, Num a) => [(a, t)] -> [(a, t)]

如预期^

fstGt0 xs = filter (\(a,b) -> a>0) xs

也是同一类型,但

fstGt0 = filter (\(a,b) -> a>0)

推断为

fstGt0 :: [(Integer, t)] -> [(Integer, t)]

为什么呢? 此外,如果我在解释器中使用

定义fstGt0
let fstGt0 = filter (\(a,b) -> a>0)

它有预期的类型。

1 个答案:

答案 0 :(得分:1)

这看起来像 Monomorphism Restriction 的效果(因为在语言中存在语无关紧要的东西,并且语言设计者无法想出一些不那么难看的东西):如果看起来像什么的话像一个值而不是一个函数(带参数),它不是多态的。 (你的fstGt0没有参数。)

有一组有序的默认类型,它们被试图替换以自动满足单态限制。 (这就是你Integer的原因。)

至于问题的GHCi部分,我不确定。我不确定GHCi let与编译let的相似程度,以及let - 表达式中代码的单同性限制是否存在一些例外情况。

必须有一个标志才能关闭限制。