В Haskell, почему был бы Вы определять функцию с ограничением типа:
ghci> :t (==)
(==) :: (Eq a) => a -> a -> Bool
Вместо того, чтобы определять его так, он - тип, был:
ghci> :t (==)
(==) :: Eq -> Eq -> Bool
Вы не сделаете вторую версию, потому что получите ошибку компиляции. Уравнение
- это не тип, это класс типов. Вы не можете использовать класс типов там, где требуется тип.
Если вы определили свой собственный тип MyEq
, а затем определили функцию ==
с типом MyEq -> MyEq -> Bool
, выражение "hello" == "hello"
будет недопустимым, потому что "hello"
является значением типа String, а не типа MyEq. Поскольку в haskell нет подтипов, значение не может одновременно иметь тип String и тип MyEq.
Итак, если вы хотите определить функцию, которая может принимать значения разных типов, удовлетворяющих определенным условиям, вам нужны классы типов.
В Haskell «тип» может иметь только один определенный набор возможных значений. который не пересекается ни с одним другим типом.Не бывает такого понятия, как "другой тип" или «подтип» другого типа.
Когда нам нужен полиморфизм, т. Е. Функции, которые могут применяться более чем к один тип, мы можем указать это, используя переменную типа в типе подпись функции.
Но переменная типа может ссылаться на любой
типа у всех. Мы не всегда знаем, как определить нашу функцию
абсолютно для любого типа. Например, (>)
функция имеет смысл только для типов, элементы которых
сопоставимы. Компилятор отклонит
функция, подпись типа которой слишком общая, чтобы
чтобы помочь нам не писать тарабарщину.
В вашем примере Eq
не является типом. Это
класс типов - имя набора типов. Мы заявляем
имена классов типов с использованием ключевого слова class
и
добавить типы в класс с помощью экземпляра
ключевое слово. Назначение класса типов - использовать в
ограничение на ограничение
область видимости переменной типа.
Подход Haskell к типам и полиморфизму основан на «Система типа Хиндли-Милнера». Это чрезвычайно точный но очень выразительный способ описания данных, который делает их проще дать компилятору огромный интеллект о типах в вашей программе. Этот интеллект помогает компилятор для автоматического определения типов, чтобы дать вам большая помощь в правильности вашей программы и оптимизации скомпилированный результат, среди прочих преимуществ.
Но будьте осторожны - это совсем не то, что есть у типов. используется в ООП, что может быть тем, к чему вы привыкли.Обычно нет прямой перевод между объектно-ориентированной программой и программой на Haskell. Вы должны думать о задаче по-другому, прямо с начало. Будьте особенно осторожны, чтобы не путать концепции Haskell. "класса" и "экземпляра" совершенно по-разному, слова используются в ООП.