45 votos

¿Cuál es la Tienda comonad?

Tener una idea de lo que el Comonad typeclass es en Haskell, he oído hablar de la Tienda comonad. Pero mirando de Control.Comonad.De la tienda.Perezoso, yo realmente no se que. ¿Qué significa esto? Para qué es esto? He oído que la Tienda = CoState, el doble de la del Estado de Mónada. ¿Qué significa eso?

48voto

Russell O'Connor Puntos 1170

Dada la siguiente definición de la tienda,

data Store s a = Store { peek :: s -> a, pos :: s }

Me gusta pensar en un Store como un gran almacén lleno de valores de tipo a. Cada valor de tipo a está ranurado en una posición de etiquetado, por un valor de índice de tipo s. Por último, hay una carretilla elevadora estacionado en la posición pos. La carretilla elevadora puede ser utilizado para extract un valor de tipo a de la tienda tirando el valor de salir de donde está aparcado. Usted puede utilizar seek a mover la carretilla elevadora para una nueva posición absoluta o uso seeks a mover la carretilla elevadora para una nueva ubicación relativa. Para actualizar todos los valores de la tienda, de uso fmap. Finalmente, extend f es similar a fmap excepto que en lugar de f :: a -> a' tenemos f :: Store s a -> a' que permite la función de actualización no sólo tiene acceso a el valor que se actualiza, pero también te da acceso a el valor de la posición y el acceso a los valores de todo lo demás en la tienda. En otras palabras, extend utiliza el valor, además de su contexto circundante para realizar la actualización.

Más computery analogía sería pensar en un Store como un gran plato de un disco duro con los valores almacenados en varias posiciones, además de una cabeza estacionado en una posición determinada.

37voto

ehird Puntos 30215

Es mucho más fácil si usted mira la definición de StoreT sí mismo.

Usted puede pensar en él como un "lugar" en una estructura más grande. Por ejemplo, una lente es sólo a -> Store b a, se puede obtener el valor de la b y un campo de función b -> a poner un nuevo valor en el contexto más amplio.

Teniendo en cuenta que en su simplicidad, no transformador forma:

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, duplicate cambios de la s -> a a una s -> Store s a que sólo devuelve la "actualización" lugar después de cambiar el valor, y extract restaura el original de un colocando el valor de nuevo en la estructura más grande.

En cuanto a su relación con el Estado se va, usted podría mirar como esta:

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X