Ing*_*ngo 16 haskell types type-systems type-inference
这听起来很傻,但我无法得到它.为什么表达式[] == []可以输入?更具体地说,哪种类型(在类Eq中)被推断为列表元素的类型?
在ghci会话中,我看到以下内容:
Prelude> :t (==[])
(==[]) :: (Eq [a]) => [a] -> Bool
Run Code Online (Sandbox Code Playgroud)
但约束也Eq [a]意味着Eq a,如下所示:
Prelude> (==[]) ([]::[IO ()])
<interactive>:1:1:
No instance for (Eq (IO ()))
arising from use of `==' at <interactive>:1:1-2
Probable fix: add an instance declaration for (Eq (IO ()))
In the definition of `it': it = (== []) ([] :: [IO ()])
Run Code Online (Sandbox Code Playgroud)
因此,在[] == []中,类型检查器必须假定列表元素是类Eq中的某种类型.但是哪一个?[]的类型只是[a],这肯定比Eq a => [a]更通用.
恕我直言这应该是暧昧的,至少在Haskell 98(这是我们所说的)
C. *_*ann 19
GHCi 扩展了类型默认的规则,这就是让你失望的原因.在这种情况下,我相信它会默认模糊类型().GHCi表现不同的微妙方式对于更好的交互性来说是好的,但它们偶尔会导致混淆......