HORIZON HASKELLDocslts/ghc-10.0.x8fef28d2026-11-02Search packagesCtrl K
Theme: |

GHC 10.0.0.20260917 · lts/ghc-10.0.x · 8fef28d · 2026-11-02

Modulecomonad-5.0.10Haskell2010

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.

Contents
  1. The Store comonad
  2. The Store comonad transformer
  3. Operations
Synopsis
  • Packagecomonad-5.0.10
  • Exports11
  • LanguageHaskell2010
  • LicenceBSD-3-Clause
  • SourceStore.hs

The Store comonad

valuestore :: (s -> a) -> s -> Store s a

Create a Store using an accessor function and a stored value

The Store comonad transformer

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

Constructors

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

Operations

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