问题很简单。我有一个看起来像这样的结构
data Foo = Foo [Bar]
data Bar = Boo | Moo Item Int
data Item = Item String Int
我有一个镜头可以改变Item
数据结构中 s 的内容,比如这个
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
,但带有镜头。有可能做这样的事情吗?