Что такое магазин comonad?


Имея некоторое представление о , что Comonad typeclass в Haskell, я слышал о comonad магазине. Но глядя на Контроль.Комонад.Магазин.Ленивый , я действительно не понимаю. Что это значит? Для чего он нужен? Я слышал, что магазин = ребристый, двойная состояния монады. Что это значит?

2 38

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 как о большой тарелке жесткого диска со значениями, хранящимися в различных положениях, плюс голова, припаркованная в определенном положении.