Das Problem ist ziemlich einfach. Ich habe eine Struktur, die so etwas wie diesesWie kann ich "over" von Control.Lens verwenden, aber eine monadische Aktion ausführen und die Ergebnisse sammeln?
data Foo = Foo [Bar]
data Bar = Boo | Moo Item Int
data Item = Item String Int
und ich habe eine Linse zum Ändern des Inhalts der Item
s innerhalb der Datenstruktur, wie diese hier
let foos = [Foo [Boo, Moo (Item "bar" 20) 10]]
over (traverse._Foo._Moo._1._Item._1) ("foo" ++) foos
-- which yields [Foo [Boo, Moo (Item "foobar" 20) 10]]
Die Struktur aussieht, ist nicht wichtig, ich wollte nur ein Beispiel zeigen, das Prismen und etwas tief verschachteltes verwendet.
Nun ist das Problem, dass ich die Funktion over
String -> IO String
statt String -> String
übergeben muss. Eine ähnliche Sache, nach der ich hier suche, ist etwas wie mapM
, aber mit Linsen. Ist es möglich, so etwas zu tun?