Sorun oldukça basit. BuControl.Lens öğesinden `over` öğesini nasıl kullanabilirim, ancak monadik bir eylem gerçekleştirebilir ve sonuçları toplayabilir miyim?
data Foo = Foo [Bar]
data Bar = Boo | Moo Item Int
data Item = Item String Int
gibi görünür bir yapıya sahip ve ben burada böyle bu
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]]
yapı olarak, veri yapısı içindeki Item
s içeriğini değiştirmek için lens var değil önemli, sadece prizmalar ve derinlemesine iç içe bir şey kullanan bir örnek göstermek istedim.
Şimdi sorun, yalnızca String -> String
yerine String -> IO String
olmak üzere over
'a geçirilen işleve ihtiyacım olmasıdır. Burada aradığım şeye benzer bir şey, mapM
, ancak lenslerle. Böyle bir şey yapmak mümkün mü?