Контекст: Этот вопрос относится конкретно к Control.Lens
(версия 3.9.1 на момент написания этой статьи)
Я использую библиотеку объективов, и очень приятно иметь возможность читать и писать кусок (или фрагменты для обхода) структуры. Затем я понял, можно ли использовать объектив для внешней базы данных. Конечно, мне тогда понадобилось бы выполнить в IO Monad
. Итак, чтобы обобщить:
Вопрос:
Для получателя, (s -> m a)
и setter (b -> s -> m t)
, где m
является Монадой, можно построить Lens s t a b
, где теперь находится Функтор объектива, также являющийся Монадой? Можно ли было бы скомпоновать их с помощью (.)
с другими "чисто функциональными" объективами?
Пример:
Могу ли я сделать Lens (MVar a) (MVar b) a b
с помощью readMVar
и withMVar
?
Альтернатива:
Существует ли эквивалент Control.Lens для контейнеров в монаде IO
, таком как MVar
или IORef
(или STDIN
)?