HORIZON HASKELLDocslts/ghc-9.10.x248f8f02026-10-05Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · 248f8f0 · 2026-10-05

Modulecomonad-5.0.9Haskell2010

Control.Comonad.Trans.Store

The store comonad holds a constant value along with a modifiable accessor function, which maps the stored value to the focus.

This module defines the strict store (aka state-in-context/costate) comonad transformer.

stored value = (1, 5), accessor = fst, resulting focus = 1:

Example1 expression
:{ let   storeTuple :: Store (Int, Int) Int   storeTuple = store fst (1, 5):}

Add something to the focus:

Example1 expression
:{ let   addToFocus :: Int -> Store (Int, Int) Int -> Int   addToFocus x wa = x + extract wa:}
Example1 expression
:{  let    added3 :: Store (Int, Int) Int    added3 = extend (addToFocus 3) storeTuple:}

The focus of added3 is now 1 + 3 = 4. However, this action changed only the accessor function and therefore the focus but not the stored value:

Example1 expression
pos added3(1,5)
Example1 expression
extract added34

The strict store (state-in-context/costate) comonad transformer is subject to the laws:

x = seek (pos x) x
y = pos (seek y x)
seek y x = seek y (seek z x)

Thanks go to Russell O'Connor and Daniel Peebles for their help formulating and proving the laws for this comonad transformer.

  • 2 types
  • 9 values
  • Packagecomonad-5.0.9
  • Exports11
  • LanguageHaskell2010
  • LicenceBSD-3-Clause
  • SourceStore.hs

The Store comonad

3 declarations
valuestore :: (s -> a) -> s -> Store s a
#

Create a Store using an accessor function and a stored value

The Store comonad transformer

2 declarations
datadata StoreT s (w :: Type -> Type) a
#

Constructors

Instances9ComonadEnv, ComonadStore, ComonadTraced, ComonadTrans, ComonadHoist, Functor, …

Operations

6 declarations
valuepos :: StoreT s w a -> s
#

Read the stored value

Example1 expression
pos $ store fst (1,5)(1,5)
valueseek :: s -> StoreT s w a -> StoreT s w a
#

Set the stored value

Example1 expression
pos . seek (3,7) $ store fst (1,5)(3,7)

Seek satisfies the law

seek s = peek s . duplicate
valueseeks :: (s -> s) -> StoreT s w a -> StoreT s w a
#

Modify the stored value

Example1 expression
pos . seeks swap $ store fst (1,5)(5,1)

Seeks satisfies the law

seeks f = peeks f . duplicate
valuepeek :: Comonad w => s -> StoreT s w a -> a
#

Peek at what the current focus would be for a different stored value

Peek satisfies the law

peek x . extend (peek y) = peek y
valuepeeks :: Comonad w => (s -> s) -> StoreT s w a -> a
#

Peek at what the current focus would be if the stored value was modified by some function

valueexperiment :: (Comonad w, Functor f) => (s -> f s) -> StoreT s w a -> f a
#

Applies a functor-valued function to the stored value, and then uses the new accessor to read the resulting focus.

Example3 expressions
let f x = if x > 0 then Just (x^2) else Nothingexperiment f $ store (+1) 2Just 5experiment f $ store (+1) (-2)Nothing