Попытка понять Haskell => по сравнению с определением типов

В Haskell, почему был бы Вы определять функцию с ограничением типа:

ghci> :t (==)  
(==) :: (Eq a) => a -> a -> Bool

Вместо того, чтобы определять его так, он - тип, был:

ghci> :t (==)  
(==) :: Eq -> Eq -> Bool
6
задан sneeu 28 June 2010 в 21:07
поделиться

2 ответа

Вы не сделаете вторую версию, потому что получите ошибку компиляции. Уравнение - это не тип, это класс типов. Вы не можете использовать класс типов там, где требуется тип.

Если вы определили свой собственный тип MyEq , а затем определили функцию == с типом MyEq -> MyEq -> Bool , выражение "hello" == "hello" будет недопустимым, потому что "hello" является значением типа String, а не типа MyEq. Поскольку в haskell нет подтипов, значение не может одновременно иметь тип String и тип MyEq.

Итак, если вы хотите определить функцию, которая может принимать значения разных типов, удовлетворяющих определенным условиям, вам нужны классы типов.

9
ответ дан 8 December 2019 в 14:40
поделиться

В Haskell «тип» может иметь только один определенный набор возможных значений. который не пересекается ни с одним другим типом.Не бывает такого понятия, как "другой тип" или «подтип» другого типа.

Когда нам нужен полиморфизм, т. Е. Функции, которые могут применяться более чем к один тип, мы можем указать это, используя переменную типа в типе подпись функции.

Но переменная типа может ссылаться на любой типа у всех. Мы не всегда знаем, как определить нашу функцию абсолютно для любого типа. Например, (>) функция имеет смысл только для типов, элементы которых сопоставимы. Компилятор отклонит функция, подпись типа которой слишком общая, чтобы чтобы помочь нам не писать тарабарщину.

В вашем примере Eq не является типом. Это класс типов - имя набора типов. Мы заявляем имена классов типов с использованием ключевого слова class и добавить типы в класс с помощью экземпляра ключевое слово. Назначение класса типов - использовать в ограничение на ограничение область видимости переменной типа.

Подход Haskell к типам и полиморфизму основан на «Система типа Хиндли-Милнера». Это чрезвычайно точный но очень выразительный способ описания данных, который делает их проще дать компилятору огромный интеллект о типах в вашей программе. Этот интеллект помогает компилятор для автоматического определения типов, чтобы дать вам большая помощь в правильности вашей программы и оптимизации скомпилированный результат, среди прочих преимуществ.

Но будьте осторожны - это совсем не то, что есть у типов. используется в ООП, что может быть тем, к чему вы привыкли.Обычно нет прямой перевод между объектно-ориентированной программой и программой на Haskell. Вы должны думать о задаче по-другому, прямо с начало. Будьте особенно осторожны, чтобы не путать концепции Haskell. "класса" и "экземпляра" совершенно по-разному, слова используются в ООП.

7
ответ дан 8 December 2019 в 14:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: