Пытаясь понять haskell's => vs определяет типы
-
01-10-2019 - |
Вопрос
В 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» и «экземпляра» с совершенно другим способом этих слов используются в ООП.