Разница между == и = в Хаскеле - PullRequest
5 голосов
/ 13 мая 2011

Мне все еще трудно понять разницу между == и = в Хаскеле.Я знаю, что первое имеет отношение к перегруженному типу, а второе «дает результат» функции, но я просто не могу разобраться с этим!Любая помощь будет высоко ценится.

Ответы [ 5 ]

15 голосов
/ 13 мая 2011

= - это специальный зарезервированный символ в Хаскеле, означающий «определяется как». Он используется для введения определений. То есть вы используете его для создания новых значений и функций, на которые можно ссылаться в определениях других значений и функций.

== - это не зарезервированный символ, а просто заурядная функция типа Eq a => a -> a -> Bool. Случается, что он объявлен в классе (Eq), но в этом нет ничего экстраординарного. Вы можете скрыть встроенную декларацию == и переопределить ее так, как вам удобно. Но обычно это означает «равно», и, поскольку он является частью класса типов, вы можете определить (перегрузить) его, чтобы обозначить все, что вы хотите, чтобы «равенство» значило для вашего конкретного типа.

Например:

data Foo = Foo Int

instance Eq Foo where
  (Foo x) == (Foo y) = x == y

Обратите внимание, что я использовал =, чтобы определить == для Foo!

Достоверный способ понять разницу состоит в том, что = утверждает равенство во время компиляции, тогда как == проверяет равенство во время выполнения.

2 голосов
/ 13 мая 2011

= выполняет назначение. или определение, вероятно, лучше слова. могу сделать это только один раз. это специальный оператор / символ. это не функция

== - это функция, обычно с добавлением, которая принимает два ввода класса типов Eq и возвращает bool

Prelude> let a = 1
Prelude> a
1
Prelude> 5 == 5
True
Prelude> 5 == 6
False
Prelude> :t (==)
(==) :: (Eq a) => a -> a -> Bool
1 голос
/ 13 мая 2011

== это оператор для сравнения, если две вещи равны. Это вполне нормальная функция haskell с типом "Eq a => a -> a -> Bool". Тип сообщает, что он работает со всеми типами значений, которые реализуют класс типов Eq, поэтому он перегружен.

С другой стороны, = - это оператор присваивания, который используется для введения определений.

1 голос
/ 13 мая 2011

Я пока не совсем эксперт по Haskell, но, как и в большинстве других языков, == - это оператор сравнения, выдающий true или false, а = - оператор присваивания, который в Haskell сводится кобъявление функции.

ghci> 5 == 5
true
ghci> "foo" == "bar"
false
ghci> let foo = "bar"
1 голос
/ 13 мая 2011

== для равенства

пример: сравнение двух целых чисел

= это присвоение

пример: присвоение целого числа переменной

...