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