2014-10-16 6 views
5

Ich habe Probleme mit PureScript typeclasses. Ich muss im Voraus sagen, dass ich kein Haskell-Experte bin, also entschuldige ich mich, wenn das offensichtliche Fehler sind.PureScript und typeclasses

Ich habe mehrere verschiedene Ansätze ausprobiert und eine Wand für jeden getroffen. Ich versuche im Grunde eine show Funktion für eine Kante in einem Diagramm zu definieren. Ein Ansatz sieht wie folgt aus:

module Foo where 

data Edge n = Edge { from :: n, to :: n } 

instance showEdge :: (Show n) => Show (Edge n) where 
    show e = "Edge from "++(show e.from)++" to "++(show e.to) 

e = Edge { from: 1, to: 2 } 

main = show e 

Das gibt mir den Fehler:

$ psc src/Attempt1.purs 
Error at src/Attempt1.purs line 6, column 27: 
Error in declaration showEdge 
Cannot unify Prim.Object with Foo.Edge. 

Ich vermute, das hat etwas mit der Tatsache zu tun, dass es die Art des e in der Definition ist Folgern von show. Ich habe versucht, hier eine Art Anmerkung hinzufügen, aber ich bekomme einen Syntaxfehler:

module Foo where 

data Edge n = Edge { from :: n, to :: n } 

instance showEdge :: (Show n) => Show (Edge n) where 
    show e :: Edge n 
    show e = "Edge from "++(show e.from)++" to "++(show e.to) 

e = Edge { from: 1, to: 2 } 

main = show e 

Das zweite, was ich versuchte, war dies:

module Foo where 

type Edge n = { from :: n, to :: n } 

instance showEdge :: (Show n) => Show (Edge n) where 
    show e = "Edge from "++(show e.from)++" to "++(show e.to) 

e :: Edge Number 
e = { from: 1, to: 2 } 

main = show e 

Das gibt mir:

$ psc src/Attempt2.purs 
Error at src/Attempt2.purs line 5, column 1: 
Type synonym instances are disallowed 

Also ich dann versuchte, explizit den zugrunde liegenden Typ aufzulisten:

module Foo where 

type Edge n = { from :: n, to :: n } 

instance showEdge :: (Show n) => Show { from :: n, to :: n } where 
    show e = "Edge from "++(show e.from)++" to "++(show e.to) 

e :: Edge Number 
e = { from: 1, to: 2 } 

main = show e 

, die mir gibt:

$ psc src/Attempt3.purs 
Error at src/Attempt3.purs line 5, column 1: 
Error in type (to :: n, from :: n): 
Type class instance head is invalid. 

Ich habe keine Ahnung, was die „Art Klasseninstanz Kopf“ ist, also habe ich nirgends von dort aus zu gehen bekam.

Alle drei Versuche sind fehlgeschlagen. Wahrscheinlich aus ganz anderen Gründen. Da ich PureScript neu kenne, weiß ich nicht, was das Problem ist. Ich habe versucht, Beispiele aus den verschiedenen Data.* Typen zu betrachten und PureScript by Example zu lesen. Ich konnte das nicht herausfinden.

Vielen Dank für Ihre Hilfe.

Antwort

7

Eigentlich waren Sie fast da mit Ihrem ersten Versuch, das Problem, das Sie hier haben, ist Edge wird ein Datum Konstruktor mit einem Feld ein Objekt enthält, während die gleiche Syntax in Haskell ist die Definition Funktionen für den Zugriff auf mehrere Felder in Ihrem Daten.

Haskell haben keine Objekte/Datensätze als erste Klasse die Art und Weise tut PURESCRIPT-Objekte, so alles, was Sie tun müssen, um das Objekt aus Ihrem Edge auszupacken:

show (Edge e) = "Edge from " ++ show e.from ++ " to " ++ show e.to

Verwandte Themen