=
- это специальный зарезервированный символ в Хаскеле, означающий «определяется как». Он используется для введения определений. То есть вы используете его для создания новых значений и функций, на которые можно ссылаться в определениях других значений и функций.
==
- это не зарезервированный символ, а просто заурядная функция типа Eq a => a -> a -> Bool
. Случается, что он объявлен в классе (Eq
), но в этом нет ничего экстраординарного. Вы можете скрыть встроенную декларацию ==
и переопределить ее так, как вам удобно. Но обычно это означает «равно», и, поскольку он является частью класса типов, вы можете определить (перегрузить) его, чтобы обозначить все, что вы хотите, чтобы «равенство» значило для вашего конкретного типа.
Например:
data Foo = Foo Int
instance Eq Foo where
(Foo x) == (Foo y) = x == y
Обратите внимание, что я использовал =
, чтобы определить ==
для Foo
!
Достоверный способ понять разницу состоит в том, что =
утверждает равенство во время компиляции, тогда как ==
проверяет равенство во время выполнения.