lens-4.7.0.1: Lenses, Folds and Traversals

Copyright(C) 2012-14 Edward Kmett
LicenseBSD-style (see the file LICENSE)
MaintainerEdward Kmett <ekmett@gmail.com>
Stabilityprovisional
PortabilityRank2Types
Safe HaskellSafe-Inferred
LanguageHaskell98

Control.Lens.Equality

Contents

Description

 

Synopsis

Type Equality

type Equality s t a b = forall p f. p a (f b) -> p s (f t)

A witness that (a ~ s, b ~ t).

Note: Composition with an Equality is index-preserving.

type Equality' s a = Equality s s a a

type AnEquality s t a b = Identical a (Identity b) a (Identity b) -> Identical a (Identity b) s (Identity t)

When you see this as an argument to a function, it expects an Equality.

runEq :: AnEquality s t a b -> Identical s t a b

Extract a witness of type Equality.

substEq :: AnEquality s t a b -> ((s ~ a, t ~ b) => r) -> r

Substituting types with Equality.

mapEq :: AnEquality s t a b -> f s -> f a

We can use Equality to do substitution into anything.

fromEq :: AnEquality s t a b -> Equality b a t s

Equality is symmetric.

simply :: (Optic' p f s a -> r) -> Optic' p f s a -> r

This is an adverb that can be used to modify many other Lens combinators to make them require simple lenses, simple traversals, simple prisms or simple isos as input.

The Trivial Equality

simple :: Equality' a a

Composition with this isomorphism is occasionally useful when your Lens, Traversal or Iso has a constraint on an unused argument to force that argument to agree with the type of a used argument and avoid ScopedTypeVariables or other ugliness.

Implementation Details

data Identical a b s t where

Provides witness that (s ~ a, b ~ t) holds.

Constructors

Identical :: Identical a b a b