Control.Lens.Equality

lens-4.13.2.1: Lenses, Folds and Traversals

Copyright | (C) 2012-16 Edward Kmett
License | BSD-style (see the file LICENSE)
Maintainer | Edward Kmett <ekmett@gmail.com>
Stability | provisional
Portability | Rank2Types
Safe Haskell | None
Language | Haskell98

Control.Lens.Equality

Contents

- Type Equality
- The Trivial Equality
- Implementation Details

Description

Synopsis

- type Equality s t a b = forall p f. p a (f b) -> p s (f t)
- type Equality' s a = Equality s s a a
- type AnEquality s t a b = Identical a (Proxy b) a (Proxy b) -> Identical a (Proxy b) s (Proxy t)
- type AnEquality' s a = AnEquality s s a a
- runEq :: AnEquality s t a b -> Identical s t a b
- substEq :: AnEquality s t a b -> ((s ~ a, t ~ b) => r) -> r
- mapEq :: forall s t a b f. AnEquality s t a b -> f s -> f a
- fromEq :: AnEquality s t a b -> Equality b a t s
- simply :: (Optic' p f s a -> r) -> Optic' p f s a -> r
- simple :: Equality' a a
- data Identical a b s t where
  - Identical :: Identical a b a b

# 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

A `Simple` `Equality`.

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

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

type AnEquality' s a = AnEquality s s a a

A `Simple` `AnEquality`.

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 :: forall s t a b f. 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 |