Что символ => означает в Хаскеле? - PullRequest
27 голосов
/ 04 февраля 2012

Я новичок в Haskell и вообще в функциональном программировании, и мне немного неловко из-за его синтаксиса.

В следующем коде, что обозначает =>? А также (Num a, Ord a)?

loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t

Ответы [ 4 ]

34 голосов
/ 04 февраля 2012

Это ограничение класса типов; (Num a, Ord a) => ... означает, что loop работает с любым типом a, который является экземпляром классов типов Num и Ord, соответствующих числовым типам и упорядоченным типам соответственно. В принципе, вы можете думать о loop как о типе справа от =>, за исключением того, что a должен быть экземпляром Num и Ord.

Вы можете думать, что классы типов в основном похожи на интерфейсы ООП (но это не одно и то же!) - они инкапсулируют набор определений, которые должен поддерживать любой экземпляр, и общий код может быть написан с использованием этих определений. Например, Num включает в себя числовые операции, такие как сложение и умножение, в то время как Ord включает в себя меньше, больше, и т. Д.

Для получения дополнительной информации о классах типов см. это введение из Learn You a Haskell .

16 голосов
/ 04 февраля 2012

=> разделяет две части сигнатуры типа:

  • Слева ограничения класса типов
  • Справа фактический тип

Таким образом, вы можете думать о (Num a, Ord a) => a -> (t -> t) -> t -> t как о значении «типом является a -> (t -> t) -> t -> t, а также должен существовать экземпляр Num для a и экземпляр Ord для a».Подробнее о классах типов см. http://www.learnyouahaskell.com/types-and-typeclasses

5 голосов
/ 05 февраля 2012

Можно подумать, что Ord a и Num a являются дополнительными входами для функции. Это особый вид ввода: словари . При использовании этой функции с конкретным типом a также должны быть доступны словари для операций Ord и Num с типом a.

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

foo :: (Num a, Ord a) => a -> t
foo x = loop x someFunc someT

Однако вам не нужно явно передавать эти словари. Haskell позаботится об этом за вас, при условии, что есть доступный словарь. Вы можете создать словарь с экземпляром класса .

instance Num MyType with
  x + y = ...
  x - y = ...
  ...

Это создает словарь для операций Num над MyType, поэтому MyType можно использовать везде, где Num a является обязательным входом (конечно, при условии, что он удовлетворяет другим требованиям).

1 голос
/ 04 февраля 2012

В левой части => вы объявляете ограничения для типов, используемых справа.

В приведенном вами примере это означает, что a должен быть экземпляром как класса типа Ord, так и класса типа Num.

...