Подпись типа Haskell с несколькими ограничениями класса

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

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

or

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

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


person Andrew Wonnacott    schedule 19.06.2012    source источник


Ответы (1)


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

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

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

Скобки имеют значение.

person Asherah    schedule 19.06.2012
comment
Ага! Спасибо. Эти скобки с запятой вызывают какой-то кортеж более высокого уровня или это другое значение скобок? - person Andrew Wonnacott; 19.06.2012
comment
@ Эндрю, на самом деле они это делают (сейчас), хотя вам, вероятно, пока не следует беспокоиться о таких вещах. Нормальные типы Haskell имеют вид kind (тип типа) *, поэтому тип кортежа имеет вид * -> * -> *. В последних версиях GHC появился новый вид Constraint, такой как Eq :: * -> Constraint, и кортежи были переведены в этот новый вид. - person Philip JF; 19.06.2012