То, как имеет тип' ([] ==) []' вывело haskell?

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

16
задан Don Stewart 19 April 2011 в 02:56
поделиться

2 ответа

GHCi имеет расширенные правила для типов по умолчанию, , что вас сбило с толку. В этом случае я считаю, что по умолчанию для неоднозначного типа будет () . Тонкие способы, которыми GHCi ведет себя по-другому, хороши для большей интерактивности, но иногда они приводят к путанице ...

19
ответ дан 30 November 2019 в 22:17
поделиться

GHC выводит наиболее общий тип:

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

Его следует читать как

  • , если у вас есть экземпляр Eq a,
  • , то Haskell может предоставить вам функцию из списков этих «а» в Bool

Итак, да, здесь подразумевается, что у вас есть экземпляр Eq для элементов list, а GHC уже имеет экземпляр для списков в целом (полагаясь на Eq для элементов), так что мы получаем хороший общий тип.

Средство проверки типов «предполагает», что вы можете предоставить экземпляр Eq a при вызове определенного типа.

Я не могу воспроизвести ваши результаты наличия ограничения Eq [a] .

1
ответ дан 30 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: