问题很简单。我有一个类似于这样的结构:
data Foo = Foo [Bar]
data Bar = Boo | Moo Item Int
data Item = Item String Int
我有一个更改数据结构中Item
内容的镜头,如下所示:
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]]
这里的结构并不重要,我只是想展示一个使用棱镜和深度嵌套的例子。
现在问题是,我需要传给over
的函数是 String -> IO String
,而不仅仅是 String -> String
。类似于我在这里寻找的东西是某种像mapM
一样的东西,但是使用的是lens。有可能做到这样吗?