Вопрос

Как бы вы определили следующие подписи типа на простом английском:

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.

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