2012-06-19 3 views
25

Как я могу иметь несколько ограничений класса, так что если A является Eq и B является Num, я мог бы сказать ниHaskell типа подписи с множественными ограничениями класса

f :: Eq a => a -> b` 

или

f :: Num b => a -> b 

Так , как я могу иметь Eq a => и Num b => в то же время?

  • f :: Eq a => Num b => a -> b,
  • f :: Eq a -> Num b => a -> b и
  • f :: Eq a, Num b => a -> b

не делать то, что я хотел.

ответ

42

Обычно их называют ограничениями класса, так как Eq и Num называются типами классов.

Как насчет этого?

f :: (Eq a, Num b) => a -> b 

Скобки значительны.

+1

Aha! Спасибо. Эти скобки с запятой вызывают какой-то более высокий уровень кортежа, или это еще одно значение круглых скобок? –

+7

@ На самом деле они делают (сейчас), хотя вы, вероятно, не должны больше беспокоиться о таких вещах. Типы Normall Haskell имеют * kind * (тип типа) '*', поэтому тип кортежа имеет вид '* -> * -> *'. В последних версиях GHC существует новый вид 'Constraint', такой, что' Eq :: * -> Constraint', и кортежи были продвинуты в этот новый вид. –

Смежные вопросы