132 votes

Manière de sténographie pour "modifier" un seul champ dans un enregistrement (copie d'un enregistrement de changer un seul champ)?

Disons que j'ai l'enregistrement suivant ADT:

data Foo = Bar { a :: Integer, b :: String, c :: String }

Je veux une fonction qui prend un dossier et renvoie un enregistrement (de même type) lorsque tous les champs ont des valeurs identiques à celui passé en argument, comme suit:

walkDuck x = Bar { a = a x, b = b x, c = lemonadeStand (a x) (b x) }

Les travaux ci-dessus, mais pour un record avec plus de champs (par exemple 10), la création d'une telle fonction entraînerait beaucoup de frappe que je ressens est tout à fait inutile.

Sont-il moins fastidieux façons de faire de même?

172voto

Chris Taylor Points 25079

Oui, il y a une belle façon de mettre à jour les champs de l'enregistrement. Dans GHCi vous pouvez faire --

> data Foo = Foo { a :: Int, b :: Int, c :: String }  -- define a Foo
> let foo = Foo { a = 1, b = 2, c = "Hello" }         -- create a Foo
> let updateFoo x = x { c = "Goodbye" }               -- function to update Foos
> updateFoo foo                                       -- update the Foo
Foo {a = 1, b = 2, c = "Goodbye" }

39voto

Don Stewart Points 94361

C'est un bon travail pour les lentilles:

data Foo = Foo { a :: Int, b :: Int , c :: String }

test = Foo 1 2 "Hello"

Alors:

setL c "Goodbye" test

permettrait de mettre à jour le champ " c " de "test" de votre chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X