`([] ==)[]`的类型如何推断出haskell?

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表现不同的微妙方式对于更好的交互性来说是好的,但它们偶尔会导致混淆......

  • @camccann:运行`ghci -Wall`.那么`[] == []`得到`警告:默认以下约束来输入'()'` (8认同)
  • @Ingo:呵呵.(实际上[GHC 6.4.2于2006年发布](http://haskell.org/ghc/download_ghc_642.html),即4年前.当前版本为6.12.2,即4个主要版本.) (4认同)