Звучит глупо, но я не могу это понять. Почему может быть введено выражение [] == []? Более конкретно, какой тип (в классе 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 ()])
Таким образом, в [] == [] средство проверки типов должно предполагать, что элемент списка представляет собой некоторый тип a, который находится в классе Eq. Но какой? Тип [] - это просто [a], и это, безусловно, более общее, чем Eq a = > [a].
ИМХО это должно быть двусмысленным, по крайней мере в Haskell 98 (о чем мы говорим)