3

ich mit dem folgenden algebraischen Datentyp in PURESCRIPT gerade arbeite ...(PURESCRIPT) Wie kann ich Mustererkennung auf einer algebraischen Datentyp, die „leer-Typ“ ist

data Extended a = Infinite | Finite a 

v1 = Finite 11 
v2 = Infinite 

Ich habe Probleme herauszufinden, wie man den "Infinite" -Fall mattiert, da es scheint, dass v2 den Typ forall t140. Extended t140 hat. Ich nehme an, dass t140 eine Art Platzhalter ist, den der Compiler automatisch ausfüllt. Der Typ von v1 ist Extended Int. Also, wenn ich Setup eine Instanz von Gl Werte des Extended zu vergleichen, das Unendliche Fall stimmt nicht überein ...

instance extendedEq :: (Eq a) => Eq (Extended a) where 
    eq (Finite a) (Finite b) = eq a b 
    eq Infinite Infinite = true 
    eq Infinite _ = false 
    eq _ Infinite = false 

Also, wenn ich versuche, und führen v2 == v2 ich den Fehler ...

No type class instance was found for Prelude.Eq (Extended _0) 

Das macht Sinn, da ich mir vorstelle, dass es versucht, eine Eq-Instanz für t140 zu finden.

Also meine Frage ist, wie kann ich Mustererkennung auf dem Infinite-Typ?

Antwort

5

Das Problem besteht nicht in der Mustererkennung oder der Implementierung Ihrer Instanz. Ihre ADT hat die gleiche Struktur wie Maybe, und wenn ich versuche,

main = print (Nothing == Nothing) 

erhalte ich den Fehlercode: https://github.com/purescript/purescript/wiki/Error-Code-NoInstanceFound

Ihre Art Parameter t140 alles in der Eq Typklasse sein könnte, so dass der Compiler ist nicht in der Lage, eine Instanz auszuwählen. Sie benötigen eine Typanmerkung zu mindestens einem der Operanden von == hinzuzufügen:

v2 = Infinite :: Extended Int 

Aber ich gebe wäre es zufriedenstellend sein, wenn der Compiler, dass Infinite == Infinite für jeden (gleichen) herausfinden kann, Parameter eingeben ...

+0

Danke für die Antwort, das macht jetzt Sinn für mich. – Albtzrly

Verwandte Themen