2016-10-03 3 views
1

verwende ich eine newtype als Feld eines Datensatzes, und Mustervergleich auf dem „Eltern“ Typ der verschachtelte Wert ist umständlich zu extrahieren:Wie dekonstruieren Sie neu in Akten verschachtelte Typen?

newtype CityName = CityName String 
newtype City = City { 
    name :: CityName 
} 
instance showCity :: Show City where 
    show (City { name }) = case name of (CityName cn) -> "City(" <> cn <> ")" 

I die „übergeordnete“ Typ deconstruct kann, aber dann I Verwenden Sie einen anderen Mustervergleich, um den umschlossenen String zu extrahieren - auch wenn der newtype nur einen Datenkonstruktor hat. Es wäre bequemer, den ganzen Typ in nur einem Muster zu dekonstruieren.

Ist das möglich? Wenn ja, kann ich die Syntax nicht richtig machen. Ich habe versucht, etwas wie show (City { name :: (CityName cn) }) = cn, aber es gibt mir Syntaxfehler. PureScript by Example hat mir auch nicht geholfen, aber vielleicht gibt es eine bessere Möglichkeit zu tun, was ich will?

Antwort

1

Was Sie versucht haben, ist fast richtig, aber man braucht nur einen einzigen Doppelpunkt, wenn Pattern-Matching-Datensätze:

instance showCity :: Show City where 
    show (City { name: CityName cn }) = "City(" <> cn <> ")" 

Doppel Kolon nur Typen für Anmerkungen versehen, Wert Ebene Zeug immer einen einzigen Doppelpunkt verwendet verwendet wird.

+0

Danke, tolle Erklärung. Ist diese Syntax irgendwo dokumentiert oder ist es genau so wie in Haskell? Ich frage mich, ob es mehr Dekonstruktions- "Tricks" gibt, von denen ich nichts weiß. – stholzm

+1

Hier gibt es einen Sprachführer zum Github Wiki: https://github.com/purescript/purescript/wiki/Language-Guide#record-patterns. Es ist wahrscheinlich auch im PureScript-Buch enthalten, aber das ist nicht wirklich eine Referenz, also vielleicht nicht der einfachste Ort, um nach solchen Dingen zu suchen! –

Verwandte Themen