任何人都可以解釋爲什麼haskell在下面的例子中強制顯式類型簽名,以及如何修改它以避免需要顯式聲明?模糊的類型變量,但不在ghci中?
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])
令人驚訝的在ghci的交互書寫的同一代碼有沒有問題,有不確定性和不打印零長度:
λ> :m +Data.List
λ> print $ length $ nub []
0 -- ?? can you explain ??
更新: 看來即使相同的限制,Data.List.nub
長度功能將不停止關於曖昧類型的投訴:
length' :: Eq a => [a] -> Int
length' [] = 0
length' (x:xs) = 1 + length' xs
main = do
print $ length' $ nub []
-- No instance for (Eq a0) arising from a use of ‘length'’
-- The type variable ‘a0’ is ambiguous
默認情況下,ghci打開擴展默認規則('-XExtendedDefaultRules'),請參閱[這裏](https://www.haskell.org/ghc/docs/7.8.2/html/users_guide/interactive-evaluation。 html),請參閱第2.4.8節。 – 2014-10-20 13:58:29
謝謝。這是一個隱藏的標誌,因爲ghci不會用':show language'列出它。我的基礎語言是:Haskell2010 使用以下修飾符: -XNoDatatypeContexts -XNondecreasingIndentation'? – 2014-10-20 14:35:41
我認爲這些規則僅適用於交互式輸入而不適用於加載的模塊,因此真正的編譯器標誌並非「真正」開啓。 – 2014-10-20 19:05:39