【发布时间】:2014-10-20 13:49:51
【问题描述】:
谁能解释为什么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])
令人惊讶的是,在 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),见here,进入2.4.8节。 -
谢谢。这是一个隐藏的标志,因为 ghci 不会用
:show language列出它我得到base language is: Haskell2010 with the following modifiers: -XNoDatatypeContexts -XNondecreasingIndentation? -
我认为规则仅适用于交互式输入而不适用于加载的模块,因此真正的编译器标志不是“真正”打开。
标签: haskell