В Haskell «тип» может иметь только один конкретный набор возможных значений
это не пересекается с любым другим типом.
Нет такого понятия, как один тип - это «другой вид»
или «подтип» другого типа.
Когда нам нужен полиморфизм, то есть функции, которые могут применяться к более чем
один тип, мы можем указать это с помощью переменной типа в типе
подпись функции.
Но переменная типа может ссылаться на любой
типа вообще. Мы не всегда знаем, как определить нашу функцию
для абсолютно любого типа. Например, (>)
Функция имеет смысл только для типов, чьи элементы
сопоставимыми. Компилятор отклонит
функция, чья сигнатура типа слишком общая, чтобы
чтобы помочь нам избежать написания тарабарщины.
В вашем примере Eq
не является типом. Это
класс типов - имя для набора типов. Мы заявляем
имена классов типов с использованием ключевого слова class
и
добавить типы в класс, используя instance
ключевое слово. Цель класса типов должна быть использована в
ограничение для ограничения
область видимости переменной типа.
Подход Haskell к типам и полиморфизму основан на
«Система типов Хиндли-Милнера». Это очень точный
но очень выразительный способ описания данных, которые делают его
проще дать компилятору огромное количество интеллекта
о типах в вашей программе. Этот интеллект помогает
компилятор автоматически выводит типы, чтобы дать вам
большая помощь в получении правильной программы и оптимизации
скомпилированный результат, среди прочих преимуществ.
Но будьте осторожны - он сильно отличается от того, как
используется в ООП, который может быть тем, к чему вы привыкли. Там обычно нет
прямой перевод между ОО-программой и программой на Haskell.
Вы должны думать о задаче иначе, чем
начало. Будьте особенно осторожны, чтобы не спутать понятия Хаскелла
«класса» и «экземпляра» с совершенно по-другому те,
слова используются в ООП.