deep-transformations-0.4.0.1: Deep natural and unnatural tree transformations, including attribute grammars
Safe HaskellNone
LanguageHaskell2010

Transformation

Description

A natural transformation is a concept from category theory for a mapping between two functors and their objects that preserves a naturality condition. In Haskell the naturality condition boils down to parametricity, so a natural transformation between two functors f and g is represented as

type NaturalTransformation f g = ∀a. f a → g a

This type appears in several Haskell libraries, most obviously in natural-transformations. There are times, however, when we crave more control. Sometimes what we want to do depends on which type a is hiding in that f a we're given. Sometimes, in other words, we need an unnatural transformation.

This means we have to abandon parametricity for ad-hoc polymorphism, and that means type classes. There are two steps to defining a transformation:

  • an instance of the base class Transformation declares the two functors being mapped, much like a function type signature,
  • while the actual mapping of values is performed by an arbitrary number of instances of the method $, a bit like multiple equation clauses that make up a single function definition.

The module is meant to be imported qualified, and the importing module will require at least the FlexibleInstances, MultiParamTypeClasses, and TypeFamilies language extensions to declare the appropriate instances.

Synopsis

Documentation

>>> :seti -XFlexibleInstances -XMultiParamTypeClasses -XTypeFamilies -XTypeOperators
>>> import Transformation (Transformation)
>>> import qualified Transformation
>>> data MaybeToList = MaybeToList
>>> instance Transformation MaybeToList where {type Domain MaybeToList = Maybe; type Codomain MaybeToList = []}

class Transformation t Source #

A Transformation, natural or not, maps one functor to another. For example, here's the declaration for a transformation that maps Maybe to `[]`:

data MaybeToList = MaybeToList instance Transformation MaybeToList where type Domain MaybeToList = Maybe type Codomain MaybeToList = []

Associated Types

type Domain t :: Type -> Type Source #

type Codomain t :: Type -> Type Source #

Instances

Instances details
Attribution t => Transformation (Knit t) Source # 
Instance details

Defined in Transformation.AG

Associated Types

type Domain (Knit t) 
Instance details

Defined in Transformation.AG

type Domain (Knit t) = Origin t
type Codomain (Knit t) 
Instance details

Defined in Transformation.AG

type Codomain (Knit t) = Semantics t
Attribution t => Transformation (T t) Source # 
Instance details

Defined in Transformation.AG.Dimorphic

Associated Types

type Domain (T t) 
Instance details

Defined in Transformation.AG.Dimorphic

type Domain (T t) = Origin t
type Codomain (T t) 
Instance details

Defined in Transformation.AG.Dimorphic

(Transformation t1, Transformation t2, Domain t1 ~ Domain t2) => Transformation (Either t1 t2) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Either t1 t2) 
Instance details

Defined in Transformation

type Domain (Either t1 t2) = Domain t1
type Codomain (Either t1 t2) 
Instance details

Defined in Transformation

type Codomain (Either t1 t2) = Sum (Codomain t1) (Codomain t2)
Transformation (Coercion p q) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Coercion p q) 
Instance details

Defined in Transformation

type Domain (Coercion p q) = p
type Codomain (Coercion p q) 
Instance details

Defined in Transformation

type Codomain (Coercion p q) = q
(Transformation t, Transformation u, Domain t ~ Codomain u) => Transformation (Compose t u) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Compose t u) 
Instance details

Defined in Transformation

type Domain (Compose t u) = Domain u
type Codomain (Compose t u) 
Instance details

Defined in Transformation

type Codomain (Compose t u) = Codomain t
Transformation t => Transformation (Folded f t) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Folded f t) 
Instance details

Defined in Transformation

type Domain (Folded f t) = Compose f (Domain t)
type Codomain (Folded f t) 
Instance details

Defined in Transformation

type Codomain (Folded f t) = Codomain t
Transformation t => Transformation (Mapped f t) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Mapped f t) 
Instance details

Defined in Transformation

type Domain (Mapped f t) = Compose f (Domain t)
type Codomain (Mapped f t) 
Instance details

Defined in Transformation

type Codomain (Mapped f t) = Compose f (Codomain t)
(Transformation t, Codomain t ~ Compose m n) => Transformation (Traversed f t) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Traversed f t) 
Instance details

Defined in Transformation

type Domain (Traversed f t) = Compose f (Domain t)
type Codomain (Traversed f t) 
Instance details

Defined in Transformation

Transformation (Fold p m) Source # 
Instance details

Defined in Transformation.Rank2

Associated Types

type Domain (Fold p m) 
Instance details

Defined in Transformation.Rank2

type Domain (Fold p m) = p
type Codomain (Fold p m) 
Instance details

Defined in Transformation.Rank2

type Codomain (Fold p m) = Const m :: Type -> Type
Transformation (Map p q) Source # 
Instance details

Defined in Transformation.Rank2

Associated Types

type Domain (Map p q) 
Instance details

Defined in Transformation.Rank2

type Domain (Map p q) = p
type Codomain (Map p q) 
Instance details

Defined in Transformation.Rank2

type Codomain (Map p q) = q
(Transformation t1, Transformation t2, Domain t1 ~ Domain t2) => Transformation (t1, t2) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (t1, t2) 
Instance details

Defined in Transformation

type Domain (t1, t2) = Domain t1
type Codomain (t1, t2) 
Instance details

Defined in Transformation

type Codomain (t1, t2) = Product (Codomain t1) (Codomain t2)
Transformation (Traversal p q m) Source # 
Instance details

Defined in Transformation.Rank2

Associated Types

type Domain (Traversal p q m) 
Instance details

Defined in Transformation.Rank2

type Domain (Traversal p q m) = p
type Codomain (Traversal p q m) 
Instance details

Defined in Transformation.Rank2

type Codomain (Traversal p q m) = Compose m q
Transformation (Arrow p q x) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Arrow p q x) 
Instance details

Defined in Transformation

type Domain (Arrow p q x) = p
type Codomain (Arrow p q x) 
Instance details

Defined in Transformation

type Codomain (Arrow p q x) = q

class Transformation t => At t x where Source #

Before we can apply a Transformation, we also need to declare At which base types it is applicable and how it works. If the transformation is natural, we'll need only one instance declaration.

>>> :{
instance MaybeToList `Transformation.At` a where
   MaybeToList $ Just x = [x]
   MaybeToList $ Nothing = []
:}
>>> MaybeToList Transformation.$ (Just True)
[True]

An unnatural Transformation can behave differently depending on the base type and even on its value.

>>> :{
instance {-# OVERLAPS #-} MaybeToList `At` Char where
   MaybeToList $ Just '\0' = []
   MaybeToList $ Just c = [c]
   MaybeToList $ Nothing = []
:}

Methods

($) :: t -> Domain t x -> Codomain t x infixr 0 Source #

Apply the transformation t at type x to map Domain to the Codomain functor.

Instances

Instances details
(At t g, Apply (g sem), Traversable (g sem), sem ~ Semantics t) => At (Knit t) (g sem sem) Source # 
Instance details

Defined in Transformation.AG

Methods

($) :: Knit t -> Domain (Knit t) (g sem sem) -> Codomain (Knit t) (g sem sem) Source #

(Attribution t, p ~ Origin t, a ~ Inherited t, b ~ Synthesized t, q ~ Semantics a b, Foldable (g q), Functor (g q), Monoid a, Monoid b, Foldable p, At t g) => At (T t) (g (Semantics a b) (Semantics a b)) Source # 
Instance details

Defined in Transformation.AG.Dimorphic

Methods

($) :: T t -> Domain (T t) (g (Semantics a b) (Semantics a b)) -> Codomain (T t) (g (Semantics a b) (Semantics a b)) Source #

(Transformation (Auto t), p ~ Domain (Auto t), q ~ Codomain (Auto t), q ~ Semantics a, a ~ Attributes (Auto t), Foldable (g q), Monoid a, Foldable p, Attribution (Auto t) g) => At (Auto t) (g (Semantics a) (Semantics a)) Source # 
Instance details

Defined in Transformation.AG.Monomorphic

Methods

($) :: Auto t -> Domain (Auto t) (g (Semantics a) (Semantics a)) -> Codomain (Auto t) (g (Semantics a) (Semantics a)) Source #

(At t x, At u x, Domain t ~ Domain u) => At (Either t u) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Either t u -> Domain (Either t u) x -> Codomain (Either t u) x Source #

Coercible (p x) (q x) => At (Coercion p q) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Coercion p q -> Domain (Coercion p q) x -> Codomain (Coercion p q) x Source #

(At t x, At u x, Domain t ~ Codomain u) => At (Compose t u) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Compose t u -> Domain (Compose t u) x -> Codomain (Compose t u) x Source #

(At t x, Foldable f, Codomain t ~ (Const m :: Type -> Type), Monoid m) => At (Folded f t) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Folded f t -> Domain (Folded f t) x -> Codomain (Folded f t) x Source #

(At t x, Functor f) => At (Mapped f t) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Mapped f t -> Domain (Mapped f t) x -> Codomain (Mapped f t) x Source #

(At t x, Traversable f, Codomain t ~ Compose m n, Applicative m) => At (Traversed f t) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Traversed f t -> Domain (Traversed f t) x -> Codomain (Traversed f t) x Source #

At (Fold p m) x Source # 
Instance details

Defined in Transformation.Rank2

Methods

($) :: Fold p m -> Domain (Fold p m) x -> Codomain (Fold p m) x Source #

At (Map p q) x Source # 
Instance details

Defined in Transformation.Rank2

Methods

($) :: Map p q -> Domain (Map p q) x -> Codomain (Map p q) x Source #

(At t x, At u x, Domain t ~ Domain u) => At (t, u) x Source # 
Instance details

Defined in Transformation

Methods

($) :: (t, u) -> Domain (t, u) x -> Codomain (t, u) x Source #

At (Traversal p q m) x Source # 
Instance details

Defined in Transformation.Rank2

Methods

($) :: Traversal p q m -> Domain (Traversal p q m) x -> Codomain (Traversal p q m) x Source #

At (Arrow p q x) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Arrow p q x -> Domain (Arrow p q x) x -> Codomain (Arrow p q x) x Source #

apply :: At t x => t -> Domain t x -> Codomain t x Source #

Alphabetical synonym for $

data Coercion (p :: Type -> Type) (q :: Type -> Type) Source #

Transformation that coerces a p x to q x

Constructors

Coercion 

Instances

Instances details
Transformation (Coercion p q) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Coercion p q) 
Instance details

Defined in Transformation

type Domain (Coercion p q) = p
type Codomain (Coercion p q) 
Instance details

Defined in Transformation

type Codomain (Coercion p q) = q
Coercible (p x) (q x) => At (Coercion p q) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Coercion p q -> Domain (Coercion p q) x -> Codomain (Coercion p q) x Source #

type Codomain (Coercion p q) Source # 
Instance details

Defined in Transformation

type Codomain (Coercion p q) = q
type Domain (Coercion p q) Source # 
Instance details

Defined in Transformation

type Domain (Coercion p q) = p

data Compose t u Source #

Composition of two transformations

Constructors

Compose t u 

Instances

Instances details
(Transformation t, Transformation u, Domain t ~ Codomain u) => Transformation (Compose t u) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Compose t u) 
Instance details

Defined in Transformation

type Domain (Compose t u) = Domain u
type Codomain (Compose t u) 
Instance details

Defined in Transformation

type Codomain (Compose t u) = Codomain t
(At t x, At u x, Domain t ~ Codomain u) => At (Compose t u) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Compose t u -> Domain (Compose t u) x -> Codomain (Compose t u) x Source #

type Codomain (Compose t u) Source # 
Instance details

Defined in Transformation

type Codomain (Compose t u) = Codomain t
type Domain (Compose t u) Source # 
Instance details

Defined in Transformation

type Domain (Compose t u) = Domain u

newtype Mapped (f :: Type -> Type) t Source #

Transformation under a Functor

Constructors

Mapped t 

Instances

Instances details
Transformation t => Transformation (Mapped f t) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Mapped f t) 
Instance details

Defined in Transformation

type Domain (Mapped f t) = Compose f (Domain t)
type Codomain (Mapped f t) 
Instance details

Defined in Transformation

type Codomain (Mapped f t) = Compose f (Codomain t)
(At t x, Functor f) => At (Mapped f t) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Mapped f t -> Domain (Mapped f t) x -> Codomain (Mapped f t) x Source #

type Codomain (Mapped f t) Source # 
Instance details

Defined in Transformation

type Codomain (Mapped f t) = Compose f (Codomain t)
type Domain (Mapped f t) Source # 
Instance details

Defined in Transformation

type Domain (Mapped f t) = Compose f (Domain t)

newtype Folded (f :: Type -> Type) t Source #

Transformation under a Foldable

Constructors

Folded t 

Instances

Instances details
Transformation t => Transformation (Folded f t) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Folded f t) 
Instance details

Defined in Transformation

type Domain (Folded f t) = Compose f (Domain t)
type Codomain (Folded f t) 
Instance details

Defined in Transformation

type Codomain (Folded f t) = Codomain t
(At t x, Foldable f, Codomain t ~ (Const m :: Type -> Type), Monoid m) => At (Folded f t) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Folded f t -> Domain (Folded f t) x -> Codomain (Folded f t) x Source #

type Codomain (Folded f t) Source # 
Instance details

Defined in Transformation

type Codomain (Folded f t) = Codomain t
type Domain (Folded f t) Source # 
Instance details

Defined in Transformation

type Domain (Folded f t) = Compose f (Domain t)

newtype Traversed (f :: Type -> Type) t Source #

Transformation under a Traversable

Constructors

Traversed t 

Instances

Instances details
(Transformation t, Codomain t ~ Compose m n) => Transformation (Traversed f t) Source # 
Instance details

Defined in Transformation

Associated Types

type Domain (Traversed f t) 
Instance details

Defined in Transformation

type Domain (Traversed f t) = Compose f (Domain t)
type Codomain (Traversed f t) 
Instance details

Defined in Transformation

(At t x, Traversable f, Codomain t ~ Compose m n, Applicative m) => At (Traversed f t) x Source # 
Instance details

Defined in Transformation

Methods

($) :: Traversed f t -> Domain (Traversed f t) x -> Codomain (Traversed f t) x Source #

type Codomain (Traversed f t) Source # 
Instance details

Defined in Transformation

type Domain (Traversed f t) Source # 
Instance details

Defined in Transformation

type Domain (Traversed f t) = Compose f (Domain t)

type family ComposeOuter (c :: Type -> Type) :: Type -> Type where ... Source #

Equations

ComposeOuter (Compose p q) = p 

type family ComposeInner (c :: Type -> Type) :: Type -> Type where ... Source #

Equations

ComposeInner (Compose p q) = q