2012-06-19 20 views
25

Wie kann ich mehrere Klasse Zwänge haben, also wenn A ein Eq und B ist ein Num, könnte ich sagen, entwederHaskell Typ Signatur mit mehreren Klasse Einschränkungen

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

oder

f :: Num b => a -> b 

So , wie kann ich Eq a => und Num b => zur gleichen Zeit haben?

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

tat nicht, was ich wollte.

Antwort

42

Sie werden normalerweise Klassenbeschränkungen genannt, da Eq und Num Klassen genannt werden.

Wie wäre es damit?

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

Die Klammern sind signifikant.

+1

Aha! Vielen Dank. Bilden diese Klammern mit einem Komma ein höheres Tupel irgendeiner Art oder ist das eine andere Bedeutung von Klammern? –

+7

@Andrew eigentlich tun sie (jetzt), obwohl Sie sich wahrscheinlich gerade nicht solche Dinge gerade jetzt sorgen sollten. Normall Haskell-Typen haben * kind * (Typ des Typs) '*', so dass der Tupel-Typ eine Art '* -> * -> *' hat. In neueren Versionen von GHC gibt es eine neue Art 'Constraint', so dass' Eq :: * -> Constraint' und Tupel auf diese neue Art hochgestuft wurden. –

Verwandte Themen