Il problema è piuttosto semplice. Ho una struttura che sembra qualcosa di simileCome posso usare `over` da Control.Lens ma eseguire un'azione monadica e raccogliere i risultati?
data Foo = Foo [Bar]
data Bar = Boo | Moo Item Int
data Item = Item String Int
e ho un obiettivo per cambiare i contenuti delle Item
s all'interno della struttura dei dati, come ad esempio questo
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]]
La struttura qui non è importante, volevo solo mostrare un esempio che utilizza prismi e qualcosa profondamente annidato.
Ora il problema è che ho bisogno che la funzione passata a over
sia String -> IO String
, anziché solo String -> String
. Una cosa simile a quello che sto cercando qui è qualcosa come mapM
, ma con lenti. È possibile fare qualcosa di simile?