Что такое магазин Comonad?
Имея некоторое представление о том, что такое класс типов Comonad в Haskell, я слышал о Comonad Store. Но, глядя на Control.Comonad.Store.Lazy, я не совсем понимаю. Что это значит? Для чего это? Я слышал, что Store = CoState, двойник Государственной Монады. Что это значит?
2 ответа
Намного проще, если вы посмотрите на само определение StoreT.
Вы можете думать об этом как о "месте" в большей структуре. Например, объектив просто 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)
Учитывая следующее определение магазина,
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
как большой диск жесткого диска со значениями, хранящимися в различных положениях, плюс головка, припаркованная в определенной позиции.