Имея некоторое представление о том, что классный класс Comonad находится в Haskell, я слышал о Store comonad. Но глядя на Control.Comonad.Store.Lazy, я действительно не понимаю. Что это значит? Для чего это? Я слышал, что Store = CoState, двойник государственной Монады. Что это значит?
Что такое магазин comonad?
Ответ 1
Это намного проще, если вы посмотрите на определение самого StoreT.
Вы можете думать об этом как о "месте" в более крупной структуре. Например, lens - это всего лишь a -> Store b a
; вы получаете значение поля b и функцию b -> a
, чтобы вернуть новое значение в больший контекст.
Учитывая это в его упрощенной форме без трансформатора:
data Store s a = Store (s -> a) s
instance Functor (Store s) where
fmap f (Store g s) = Store (f . g) s
instance Extend (Store s) where
duplicate (Store f s) = Store (Store f) s
instance Comonad (Store s) where
extract (Store f s) = f s
то есть. duplicate
изменяет s -> a
на s -> Store s a
, который просто возвращает "обновленное" место после замены значения, а extract
восстанавливает оригинал a, помещая значение обратно в более крупную структуру.
Что касается его отношения к государству, вы можете посмотреть на него следующим образом:
type State s a = s -> (a, s)
type Store s a = (s -> a, s)
Ответ 2
Учитывая следующее определение хранилища,
data Store s a = Store { peek :: s -> a, pos :: s }
Мне нравится думать о Store
как большом хранилище, заполненном значениями типа a
. Каждое значение типа a
помещается в позицию, помеченную значением индекса типа s
. Наконец, есть вилочный погрузчик, припаркованный в положении pos
. Автопогрузчик может использоваться для extract
значения типа a
из магазина, вытаскивая значение из того места, где он припаркован. Вы можете использовать seek
для перемещения вилочного погрузчика в новое абсолютное положение или использовать seeks
для перемещения вилочного погрузчика в новое относительное местоположение. Чтобы обновить все значения хранилища, используйте fmap
. Наконец extend f
похож на fmap
, но вместо f :: a -> a'
мы имеем f :: Store s a -> a'
, который позволяет функции обновления не только иметь доступ к обновляемому значению, но также дает доступ к позиции значения и доступ к значениям всего еще в магазине. Другими словами, extend
использует значение плюс его окружающий контекст для выполнения обновления.
Более аналогичной аналогии будет думать о Store
как о большой пластине жесткого диска со значениями, хранящимися в разных положениях, плюс головка, припаркованная в определенном положении.