任何人都可以解释为什么haskell在以下示例中强制执行显式类型签名以及如何修改它以避免需要显式声明?
import qualified Data.List as L
main = do
print $ length $ L.nub [1,1,2,3] -- 3, passed (Eq a, Num a) => [a]
print $ length $ L.nub [] -- ambiguous type error, passed (Eq a) => [a]
-- can help type system with explicit signature but how to avoid ?
print $ length $ L.nub ([] :: [Int])
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,在ghci中以交互方式编写的相同代码没有歧义问题,并且打印零长度:
?> :m +Data.List
?> print $ length $ nub []
0 -- ?? can you explain ??
Run Code Online (Sandbox Code Playgroud)
更新: 看起来甚至同样限制 …
haskell ×1