Проблема довольно проста. У меня есть структура, которая выглядит примерно так
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
, но с линзами. Можно ли сделать что-то подобное?