En utilisant une bibliothèque de lentilles je peux appliquer une fonction de modification des objectifs individuels, comme ceci:Combinant lentilles
Prelude Control.Lens> (1, 'a', 2) & _1 %~ (*3)
(3,'a',2)
Prelude Control.Lens> (1, 'a', 2) & _3 %~ (*3)
(1,'a',6)
Comment puis-je combiner ces lentilles individuelles (_1
et _3
) pour être en mesure d'effectuer cette mise à jour aux deux objectifs à la fois? Je me attends quelque chose dans l'esprit de ce qui suit:
Prelude Control.Lens> (1, 'a', 2) & ??? %~ (*3)
(3,'a',6)
Je ne suis pas sûr qu'il existe une implémentation judicieuse d'une telle opération. Dites que l'opérateur qui combine vos deux lentilles est '(&&&)'. Il doit avoir un type quelque chose comme '(&&&) :: Lentille a b -> Lentille a b -> Lentille a b' de sorte que vous puissiez l'utiliser de la même manière que les deux lentilles que vous combinez pour le faire. Étant donné que 'view _1 (1,2) = 1' et' view _2 (1,2) = 2', qu'attendez-vous du résultat de 'view (_1 &&& _2) (1,2)'? –
@ChrisTaylor Je n'ai pas vraiment besoin de la fonctionnalité "getter". Bien qu'AFAIU dans cette bibliothèque, il soit classique d'approcher de tels cas avec un monoïde, par ex. le [Traversal] (http://hackage.haskell.org/packages/archive/lens/latest/doc/html/Control-Lens-Traversal.html). –
J'ai lié cela dans les commentaires ci-dessous, mais au cas où quelqu'un le manquerait, il y a un [problème d'objectif] (https://github.com/ekmett/lens/issues/109) sur la combinaison des traversées et les problèmes qu'elles causent. – shachaf