Как увеличить кислотное состояние?

data Foo = Foo {
  _bar :: Map String Integer
} deriving (Eq, Ord, Read, Show, Data, Typeable)

$(deriveSafeCopy 0 'base 'Foo)

$(makeLenses ''Foo)

учитывая приведенный выше код, у меня сложилось впечатление, что это должно быть возможно:

addEntry :: String -> Update Foo ()
addEntry s = zoom bar $ modify $ insert s 0

но GHC будет жаловаться по строкам:

src/Backend.hs:39:20:
    No instance for (Functor
                       (Control.Lens.Internal.Zoom.Zoomed (Update Foo) ()))

какие идеи?

1 ответов


Control.Lens.Internal.Zoom.Zoomed - это семейство типов, которое описывает, какой контекст требуется во время zoom. Он выполняет некоторые специальные магии, как вы можете видеть в Control.Lens.Internal.Zoom модуль. Обычно пользователь zoom никогда не нужно было бы видеть этот материал, пока они увеличивают "типичный" стек трансформатора монады.

Update, при реализации как раз State под обложками, не имеет экземпляра масштабирования. Его реализация также не экспортируется, поэтому вы не можете написать свой собственный, хотя это было бы довольно тривиально, так как Update не использует трансформаторы монады.

type instance Zoomed (Update x) = Focusing Identity