2016-10-03 1 views
1

J'utilise un newtype comme champ d'un enregistrement, et la correspondance de motif sur le type « parent » pour extraire la valeur imbriquée est lourd:Comment déconstruire proprement les nouveaux types imbriqués dans des enregistrements?

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

je peux déconstruire le type « parent », mais je utilisez un autre modèle correspondant pour extraire la chaîne encapsulée - même si le newtype n'a qu'un seul constructeur de données. Il serait plus pratique de déconstruire tout le type en un seul motif.

Est-ce possible? Si oui, je ne peux pas obtenir la syntaxe correcte. J'ai essayé quelque chose comme show (City { name :: (CityName cn) }) = cn mais cela me donne des erreurs de syntaxe. PureScript by Example ne m'a pas aidé non plus, mais peut-être qu'il y a une façon plus simple de faire ce que je veux?

Répondre

1

Qu'est-ce que vous avez essayé est presque droit, mais vous avez seulement besoin du côlon unique lorsque motif enregistrements correspondants:

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

côlon double est utilisé uniquement pour les annoter, des trucs de niveau de valeur utilise toujours un seul colon.

+0

Merci, bonne explication. Cette syntaxe est-elle documentée quelque part, ou est-ce la même chose que dans Haskell? Je me demande s'il y a plus de «trucs» de déconstruction que je ne connais pas. – stholzm

+1

Il existe un guide linguistique sur le wiki Github ici: https://github.com/purescript/purescript/wiki/Language-Guide#record-patterns. C'est probablement aussi couvert dans le livre de PureScript, mais ce n'est pas vraiment une référence donc peut-être pas l'endroit le plus facile de chercher ce genre de chose! –