В настоящее время я изучаю Haskell и застрял на создании экземпляров типов в классы типов. Я вообще-то не понимаю, почему можно создать значение типа Maybe a
с помощью Just (+)
.
Проблема, почему это ведет себя странно для меня, заключается в том, что тип Maybe определен как экземпляр класса типов Eq
(см. исходный код Haskell) и что если вы получаете экземпляр для типа, все поля конструкторов значений / данных этого типа также должны быть экземпляр класса типов Eq
(здесь).
Помня об этом, следующий код не должен быть компилируемым или исполняемым, поскольку функция не является частью класса типов Eq
:
let a = Just (+)
let b = Just (-)
Но на самом деле GHCi выполняет код, не выдавая сообщения об ошибке. Если вы затем попытаетесь сравнить эти два значения (что также не должно быть возможным), интерпретатор выдаст следующее сообщение об ошибке:
a == b
<interactive>:24:1: error:
* No instance for (Eq (Integer -> Integer -> Integer))
arising from a use of `=='
(maybe you haven't applied a function to enough arguments?)
* In the expression: a == b
In an equation for `it': it = a == b
Эта проблема также возникает, если вы создаете свой собственный тип Maybe a
.
let a = Just (+)
должно быть ошибкой? Это значение типаMaybe (Integer -> Integer -> Integer)
- что в этом плохого? Вы не можете сравниватьa==b
, конечно, но вы также не можете сравнивать(+)==(-)
, но я думаю, что вы в порядке с существующим(+)
. Если(+)
существует, почемуJust (+)
следует запретить? - person chi   schedule 05.08.2019