Типы подписей для списков и т. Д.
-
28-10-2019 - |
Вопрос
Как бы вы определили следующие подписи типа на простом английском:
Ord a => ...
Eq a => ...
Num a => ...
Не могли бы вы описать это значение этого и сообщить мне, каковы различия (с точки зрения того, как я бы объяснил это кому -то еще)?
Спасибо.
Решение
Все это примеры «ограничений класса»: они ограничивают, какие типы можно использовать вместо переменной типа, которая следует за ними (a
в этом случае), требуя, чтобы он принадлежал к конкретному Тип класса. Ord
, Eq
а также Num
примеры классов типов.
Ord a => ...
означаетa
это тип, который имеет естественное понятие порядок, связанный с ним. Например, целые числа могут быть естественно расположены от меньшего до более крупного. В математических терминах существует общий заказ наa
. Анкет Очевидный пример функция, которая требует этого ограничения, являетсяsort :: Ord a => [a] -> [a]
; Прочитайте эту подпись как сказать, чтоsort
Работает только в списках вещей, которые могут быть введены в порядке по сравнению друг с другом.Eq a => ...
означаетa
это тип, членов которого можно сравнить друг с другом для некоторого понятия о равенстве. В математических терминах существует Эквивалентность отношения наa
. Анкет Обратите внимание, что это суперклассOrd
, что означает все, что имеет представление о упорядочении, также должно иметь понятие эквивалентности. Пример функции, которая требует этого ограничения, являетсяelem :: Eq a => a -> [a] -> Bool
(который определяет, содержит ли список заданный элемент); Прочитайте эту подпись как сказать, чтоelem
Работает только в списках вещей, которые можно сравнить друг с другом для равенства. Если вы подумаете о том, как бы вы написалиelem
Сам, это должно иметь смысл.Num a => ...
означаетa
это числовой тип, что означает, что он поддерживает некоторые основные арифметические операции:+
,*
,-
,abs
. Анкет Я считаю, что это примерно похоже на математическое представление о звенеть. Анкет В основном все типы, которые вы думаете как «типы числа», принадлежат этому классу:Int
,Double
, и т. д. вы увидитеNum a =>
Ограничение перед подписью, если функция была записана для работы в целом с каким -либо числом. Например,sum :: Num a => [a] -> a
, который суммирует все элементы списка чисел, может работать одинаково хорошо на[Int]
,[Double]
,[Rational]
, и т. Д. Все, что ему нужно сделать, это сложить его содержимое, независимо от того, какие они цифры. Но цифры они должны быть!
По сути, эти классы типа/ограничения являются подходом к «принципиальной перегрузке» функций. Мы можем использовать (==) :: Eq a => a -> a -> Bool
на различных типах, но Не только любые типы. Анкет Некоторые вещи, например, функции, не имеют смысла сравнивать равенство (возможно, потому что равенство не требуется для этого типа), и это никогда имеет смысл сравнить две вещи другой Типы для равенства (контрастируют с Java, где вы можете сравнить любые два объекта, возможно, разных типов для равенства).
Для дальнейшего (очень доступного) чтения на классах типов и ограничениях я настоятельно рекомендую Узнайте вам Haskell.