haskell - title tag html
¿Qué es la tienda Comonad? (2)
Al tener una idea de lo que es la clase de tipo Comonad en Haskell , he oído hablar de la comandancia de la Tienda. Pero mirando Control.Comonad.Store.Lazy , realmente no lo entiendo. Qué significa eso? ¿Para qué sirve? Escuché que Store = CoState, el dual de State Monad. Qué significa eso?
Dada la siguiente definición de tienda,
data Store s a = Store { peek :: s -> a, pos :: s }
Me gusta pensar en una Store
como un gran almacén lleno de valores de tipo a
. Cada valor de tipo a
está ranurado en una posición etiquetada por un valor de índice de tipo s
. Finalmente hay una carretilla elevadora estacionada en la posición pos
. La carretilla elevadora se puede utilizar para extract
un valor de tipo a
de la tienda tirando del valor desde donde está estacionado. Puede usar seek
para mover la carretilla elevadora a una nueva posición absoluta o utilizar seeks
mover la carretilla elevadora a una nueva ubicación relativa. Para actualizar todos los valores de la tienda use fmap
. Finalmente extend f
es similar a fmap
excepto que en lugar de f :: a -> a''
tenemos f :: Store sa -> a''
que permite que la función de actualización no solo tenga acceso al valor que se está actualizando sino que también da acceso a los valores posición y acceso a los valores de todo lo demás en la tienda. En otras palabras, extend
usa el valor más su contexto circundante para realizar la actualización.
Una analogía más informática sería pensar en una Store
como una gran fuente de un disco duro con valores almacenados en varias posiciones, más una cabeza estacionada en una posición particular.
Es mucho más fácil si miras la definición de StoreT .
Puedes pensar que es un "lugar" en una estructura más grande. Por ejemplo, una lens es solo a -> Store ba
; obtienes el valor del campo b y una función b -> a
para volver a poner un nuevo valor en el contexto más amplio.
Considerándolo en su forma simplificada, no transformadora:
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
es decir, el duplicate
cambia s -> a
en s -> Store sa
que simplemente devuelve el lugar "actualizado" después de reemplazar el valor, y extract
restaura el original a colocando el valor de nuevo en la estructura más grande.
En lo que respecta a su relación con el Estado, podrías verlo así:
type State s a = s -> (a, s)
type Store s a = (s -> a, s)