Je n'aime pas déstructurer les valeurs typées sum avec la correspondance de modèle. Cela me semble étranger à cause de son style pointu. Je préfère écrire et utiliser les fonctions switch
pour les types de somme.Déstructuration sans point avec GHC
Ma question concerne tout type de somme généralement, mais je démontrer sur Either
comme exemple:
data Processor cl cr r = MakeProcessor { l :: cl -> r, r :: cr -> r }
switch :: Processor cl cr r -> Either cl cr -> r
switch p ei =
case ei of
Left x -> l p x
Right x -> r p x
Avec cette extension Either
:
au lieu de ceci:
map f e =
case e of
Left x -> Left x
Right x -> Right (f x)
je peux écrire ceci:
map f = switch (MakeProcessor { l : Left, r : f >>> Right })
, que je me sens plus agréable pour la plupart des situations.
Pour écrire un tel type d'extension, les travaux d'extension [Processor
, switch
] sont des travaux mécaniques. Je me demande donc: est-il possible de faire en sorte que le compilateur [GHC] le fasse pour moi? Ou tout autre moyen de déstructurer des valeurs typées somme dans un style inutile?
Remarque: J'ai utilisé Either
comme exemple. Either
était un mauvais choix, car de nombreux lecteurs pensaient que ma question portait sur Either
spécifiquement, et donc m'a indiqué either
. Je l'ai utilisé un type de somme qui est pas dans la bibliothèque de base, comme
data Result a b = Fail a | Success b
Vous trouverez peut-être la bibliothèque «lens» utile. Cela vous permettrait d'écrire votre fonction 'map' en tant que' over _Right'. –
Je suppose que _Right vient de TemplateHaskell, non? Peut-être que c'est trop strict, mais j'évitais TH parce que ce n'est pas compatible avec SafeHaskell. – libeako
Mon exemple '' Sither' est juste un exemple de ma méthode pour éviter la correspondance de formes. C'est une version plus sûre de la fonction 'soit' dans la bibliothèque de base. Ma question ne concerne pas spécifiquement «Sither», je l'utilise uniquement à titre d'exemple. – libeako