Warum GHCI eine equality type Einschränkung in der Art Signatur für diese Funktion Liste matchInt
, die ich über Mustervergleich aufgebaut:Warum hat eine Funktion, die mit Mustererkennung erstellt wurde, die Integritätsbedingung Typ Eq, aber nicht bei Verwendung eines Datenkonstruktors?
$ ghci
GHCi, version 8.2.1: http://www.haskell.org/ghc/ :? for help
Prelude> :{
Prelude| matchInt 1 = 3
Prelude| matchInt _ = 4
Prelude| :}
Prelude> matchInt 1
3
Prelude> matchInt 22
4
Prelude> :t matchInt
matchInt :: (Eq a, Num a, Num p) => a -> p
Wenn dagegen einen einfachen Daten Konstruktor verwendet, gibt es keine Einschränkung Gleichheit Art.
$ ghci
GHCi, version 8.2.1: http://www.haskell.org/ghc/ :? for help
Prelude> data Z = Y Int
Prelude> :{
Prelude| matchDataInt (Y 1) = 3
Prelude| matchDataInt _ = 4
Prelude| :}
Prelude> matchDataInt (Y 1)
3
Prelude> matchDataInt (Y 22)
4
Prelude> :t matchDataInt
matchDataInt :: Num p => Z -> p
Tat Instanzen von Z kann nicht vergleichen:
Prelude> Y 22 == Y 33
<interactive>:11:1: error:
• No instance for (Eq Z) arising from a use of ‘==’
• In the expression: Y 22 == Y 33
In an equation for ‘it’: it = Y 22 == Y 33
Also noch einmal, warum hat die matchInt
Funktionsliste der Gleichheit als Einschränkungsart aber nicht die Funktion matchDataInt
?
Diese question ist verwandt. Wenn jedoch ein Gleichheitstest für matchInt
benötigt wird, warum wird er nicht für matchDataInt
benötigt? Und hier komme ich zu meinem wichtigsten Punkt: nicht beidematchInt
und matchDataInt
müssen gegen 1 für die Mustererkennung zu arbeiten zu testen?