basic-lens-0.0.2: Basic lens type and functions

Safe HaskellNone




Basic lens type and functions.

The lens package should be a drop-in replacement for this.


Lens type

type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t Source #


A value of type Lens s t a b provides the following:

  • A reference into the structure s to read and update the value a inside it.
  • The possibility to change the type of s to t and the type of a to b.

The Functor constraint

Operations may do something more interesting inside the f functor. For the purpose of this module and package, all the functions below (view, over, set) use a no-op functor and therefore the above type is equivalent to:

type Lens s t a b = (a -> b) -> (s -> t)

But it is left generic for forward compatibilty with the lens package.


λ> data Person = Person { personChar :: Char, personAge :: Int } deriving Show
λ> view $(field 'personChar) (Person a 10)
λ> over $(field 'personAge) (*2) (Person a 10)
Person {personChar = a, personAge = 20}


1) Get-Put: You get back what you put in.

view l (set l v s) ≡ v

2) Put-Get: Putting back what you got doesn't change anything.

set l (view l s) s ≡ s

3) Put-Put: Setting is idempotent.

set l v (set l v s) ≡ set l v s


view :: Lens s t a b -> s -> a Source #

Get the a inside the s.

set :: Lens s t a b -> b -> s -> t Source #

Set the a inside the s, optionally changing the types to b and t.

over :: Lens s t a b -> (a -> b) -> s -> t Source #

Modify the a inside the s, optionally changing the types to b and t.

field :: Name -> Q Exp Source #

Make a lens from a field name.

Example: over $(field 'foo) (*2)