Вопрос

В Haskell зачем вы определите функцию с ограничением типа:

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

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

ghci> :t (==)  
(==) :: Eq -> Eq -> Bool
Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

В вашем примере, Eq не тип. ЭтоTypeClass. - имя для набора типов. Мы объявляем названия Typlass, используя class ключевое слово и добавить типы в класс, используя instanceключевое слово. Цель типекласс должна использоваться в ограничении ограничения объема переменной типа.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top