Каков тип `([] ==) []` выведенного haskell? - PullRequest
16 голосов
/ 21 мая 2010

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

Ответы [ 2 ]

19 голосов
/ 21 мая 2010

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

1 голос
/ 21 мая 2010

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

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

Следует читать как:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...