Звучит глупо, но я не могу этого понять. Почему выражение [] == [] может быть напечатано вообще? Более конкретно, какой тип (в классе 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 (о чем мы говорим)