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)]
为什么呢? 此外,如果我在解释器中使用
定义fstGt0let fstGt0 = filter (\(a,b) -> a>0)
它有预期的类型。
答案 0 :(得分:1)
这看起来像 Monomorphism Restriction 的效果(因为在语言中存在语无关紧要的东西,并且语言设计者无法想出一些不那么难看的东西):如果看起来像什么的话像一个值而不是一个函数(带参数),它不是多态的。 (你的fstGt0
没有参数。)
有一组有序的默认类型,它们被试图替换以自动满足单态限制。 (这就是你Integer
的原因。)
至于问题的GHCi部分,我不确定。我不确定GHCi let
与编译let
的相似程度,以及let
- 表达式中代码的单同性限制是否存在一些例外情况。
必须有一个标志才能关闭限制。