J'ai une liste d'enregistrements et j'ai besoin d'une fonction qui recherche la liste d'un enregistrement avec un nom donné et modifie la valeur de cet enregistrement ou em> si aucun enregistrement correspond à une nouvelle enregistrement sur le résultat résultant. liste. Voici mon code jusqu'à présent: Cela fonctionne bien, mais je me demande s'il y a une manière plus directe d'écrire cela en utilisant mise à jour em>: voici un gist de la source à Expériment: https://gist.github.com/skoschnicke/5795863 p> p> data.lens code> (sans le
si code> -Construction)? Aussi, dois-je écrire la fonction
_Find code> ou y at-il quelque chose d'équivalent dans la bibliothèque? P>
3 Réponses :
Je ne sais pas, mais vous pouvez écrire un peu comme
donc, c'est le même sens Obtenir une partie peut être imitée avec maintenant, en supposant que "plus directe voie" est un peu intelligent _Find code> n'est pas réellement un
trafersal code>
: filtré code> a > N'est-ce pas une traversée. p>
filtré code> (Ça va ici depuis
pli code>
n'a pas de lois): p> Traversal code>: Non, ce n'est pas possible,
Traversal code> S ne peut pas modifier la structure de la chose traversée. p> p>
Je pense que je dois en lire d'autres sur les lentilles pour comprendre cela, mais merci d'avoir souligné cela! Je suppose qu'il n'y a rien de tel qu'un Traversal code> qui peut i> changer la structure de la chose traversée?
C'est exact, il n'y a rien de tel. Le problème est que vous ne pouvez pas avoir de bonnes lois pour cela.
Que diriez-vous:
changeOrCreate :: String -> (Int -> Int) -> [SomeRec] -> [SomeRec] changeOrCreate nameToSearch valModifier = pos . val %~ valModifier & outside (filtered (not . has pos)) %~ (. newRec) where pos :: Traversal' [SomeRec] SomeRec pos = taking 1 (traversed . filtered (anyOf name (== nameToSearch))) newRec = (SomeRec nameToSearch 0 :)
Donc, un prisme code> me permet de changer la liste? Je pense que je dois tester cela pour comprendre complètement, le fera demain!
Fonctionne bien! Mais autant que je sache, avec l'utilisation de filtré code>,
POS code> n'est pas valide
Traversal code> plus, non? Celles-ci ne sont généralement pas compostables avec d'autres travers.
Ce n'est en effet pas un achatsal valide code> si vous l'utilisez pour modifier le champ code> nom code> et que le prédicat ne contienne plus ("Règles" peut casser, comme démontré la réponse de Matvey) , mais sinon, il est composé d'autres travers.