首页 文章

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

提问于
浏览
16

这听起来很傻,但我无法得到它 . 为什么表达式[] == []可以输入?更具体地说,哪种类型(在类Eq中)被推断为列表元素的类型?

在ghci会话中,我看到以下内容:

Prelude> :t (==[])
(==[]) :: (Eq [a]) => [a] -> Bool

但约束 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 ()])

因此,在[] == []中,类型检查器必须假定列表元素是类Eq中的某种类型 . 但是哪一个? []的类型只是[a],这肯定比Eq a => [a]更通用 .

恕我直言这应该是暧昧的,至少在Haskell 98(这是我们所说的)

2 回答

  • 19

    GHCi有extended rules for type defaulting,这就是让你失望的原因 . 在这种情况下,我相信它会将模糊类型默认为 () . GHCi表现不同的微妙方式对于更好的交互性来说是好的,但它们偶尔会导致混淆......

  • 1

    GHC推断最常见的类型:

    (== [])::(Eq a)=> [a] - >布尔

    它应该被理解为:

    • 如果你有一个Eq a的实例,

    • 然后Haskell可以从那些'a'到Bool的列表中给你一个函数

    所以是的,这里的含义是你有一个Eq实例用于列表的元素,GHC已经有一个列表实例(依赖于元素的Eq),所以我们得到了一个很好的通用类型 .

    类型检查器“假定”您可以在特定类型调用时提供Eq实例 .

    我无法重现您拥有 Eq [a] 约束的结果 .

相关问题