Это звучит глупым, но я не могу получить его. Почему может выражение [] == [] быть введенным вообще? Строго говоря, то, которые вводят (в классе 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. Но который? Тип [] просто, и это является, конечно, более общим, чем Eq =>.
По моему скромному мнению, это должно неоднозначным, по крайней мере, в Haskell 98 (который является тем, что мы говорим о),
GHCi имеет расширенные правила для типов по умолчанию, , что вас сбило с толку. В этом случае я считаю, что по умолчанию для неоднозначного типа будет ()
. Тонкие способы, которыми GHCi ведет себя по-другому, хороши для большей интерактивности, но иногда они приводят к путанице ...
GHC выводит наиболее общий тип:
(== []) :: (Eq a) => [a] -> Bool
Его следует читать как
Итак, да, здесь подразумевается, что у вас есть экземпляр Eq для элементов list, а GHC уже имеет экземпляр для списков в целом (полагаясь на Eq для элементов), так что мы получаем хороший общий тип.
Средство проверки типов «предполагает», что вы можете предоставить экземпляр Eq a при вызове определенного типа.
Я не могу воспроизвести ваши результаты наличия ограничения Eq [a]
.