Что такое магазин comonad?
Имея некоторое представление о , что Comonad typeclass в Haskell, я слышал о comonad магазине. Но глядя на Контроль.Комонад.Магазин.Ленивый , я действительно не понимаю. Что это значит? Для чего он нужен? Я слышал, что магазин = ребристый, двойная состояния монады. Что это значит?
2 ответа:
Гораздо проще, если вы посмотрите на определение самого Сторета.
Вы можете думать о нем как о" месте " в более крупной структуре. Например, линза - это просто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'
, который позволяет функции update не только иметь доступ к обновляемому значению, но также дает доступ к позиции значения и доступ к значениям всего остального в хранилище. Другими словами,extend
использует значение плюс его окружающий контекст для выполнения обновления.Более компьютерная аналогия была бы подумайте о
Store
как о большой тарелке жесткого диска со значениями, хранящимися в различных положениях, плюс голова, припаркованная в определенном положении.