Что такое магазин Comonad? - PullRequest
41 голосов
/ 07 января 2012

Имея некоторое представление о , что такое класс типов Comonad в Haskell , я слышал о Comonad Store. Но, глядя на Control.Comonad.Store.Lazy , я не совсем понимаю. Что это значит? Для чего это? Я слышал, что Store = CoState, двойник Государственной Монады. Что это значит?

Ответы [ 2 ]

41 голосов
/ 24 июня 2012

Учитывая следующее определение магазина,

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

35 голосов
/ 07 января 2012

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

Что касается его отношения к State, вы можете посмотреть на это так:

type State s a = s -> (a, s)
type Store s a = (s -> a, s)
...