Disons que j'ai l'enregistrement ADT suivant:
data Foo = Bar { a :: Integer, b :: String, c :: String }
Je veux une fonction qui prend un enregistrement et renvoie un enregistrement (du même type) où tous les champs sauf un ont des valeurs identiques à celui passé en argument, comme ceci:
walkDuck x = Bar { a = a x, b = b x, c = lemonadeStand (a x) (b x) }
Ce qui précède fonctionne, mais pour un enregistrement avec plus de champs (par exemple 10
), la création d'une telle fonction impliquerait beaucoup de frappe qui, à mon avis, est tout à fait inutile.
Existe-t-il des moyens moins fastidieux de faire de même?
Réponses:
Oui, il existe un bon moyen de mettre à jour les champs d'enregistrement. Dans GHCi, vous pouvez faire -
la source
RecordWildCards
extension peut également être intéressante pour «décompresser» les champs d'un scope. Pour les mises à jour, ce n'est pas aussi bien cependant:incrementA x@Foo{..} = x { a = succ a }
updateFoo x = x.{ c = "Goodbye" }
(notez l'.
opérateur).C'est un bon travail pour les objectifs :
Ensuite:
mettrait à jour le champ «c» de «test» avec votre chaîne.
la source
test $ c .~ "Goodbye"
comment lelens
ferait iirc. Je ne dis pas que c'est intuitif, mais une fois que vous connaissez les opérateurs, je pense que cela viendra aussi facilement que$
.Vous n'avez pas besoin de définir des fonctions auxiliaires ou d'utiliser des objectifs. Standard Haskell a déjà ce dont vous avez besoin. Prenons l'exemple de Don Stewart:
Ensuite, vous pouvez simplement dire
test { c = "Goodbye" }
pour obtenir un enregistrement mis à jour.la source