Category theory/Natural transformation
From HaskellWiki
m (Spell-check with ispell) |
m (→Functor and natural transformation: “zero-or-one-or-many-occurrences” - parser of list of things) |
||
| (2 intermediate revisions not shown.) | |||
| Line 174: | Line 174: | ||
Let us imagine we have any processing (storing, archiving etc.) function which processes lists (or any other reason which forces us to convert our results to list format and exclude any Maybe's). (Perhaps, all this example is impractical and exaggerated, because in real life we should solve the whole thing in other ways.) | Let us imagine we have any processing (storing, archiving etc.) function which processes lists (or any other reason which forces us to convert our results to list format and exclude any Maybe's). (Perhaps, all this example is impractical and exaggerated, because in real life we should solve the whole thing in other ways.) | ||
| - | Thus, we want to build a parser combinator (we could notate it graphically with something like <math>\mathrm?\!\!\to\!\!\mathrm*</math>) which converts a “zero-ore-one-occurrence” like parser to a “zero-or-one-many-occurrences” like parser. | + | Thus, we want to build a parser combinator (we could notate it graphically with something like <math>\mathrm?\!\!\to\!\!\mathrm*</math>) which converts a “zero-ore-one-occurrence” like parser to a “zero-or-one-or-many-occurrences” like parser. |
We can convert <hask>Maybe</hask> to list with <hask>maybeToList</hask> | We can convert <hask>Maybe</hask> to list with <hask>maybeToList</hask> | ||
| Line 200: | Line 200: | ||
fmap maybeToList :: Parser (Maybe [String]) -> Parser [String] | fmap maybeToList :: Parser (Maybe [String]) -> Parser [String] | ||
</haskell> | </haskell> | ||
| - | :<math>\mathrm{Hom}{(\Lambda\Phi)(X),\;(\Lambda\Psi)(X) | + | :<math>(\Lambda\eta)_X \in \mathrm{Hom}_{\mathcal D}((\Lambda\Phi)(X),\;(\Lambda\Psi)(X))</math> |
In fact, we have a new “datatype converter”: converting not Maybe's to lists, but parser on Maybe to Parser on list. Let us notate the corresponding natural transformation with <math>\Lambda\eta</math>: | In fact, we have a new “datatype converter”: converting not Maybe's to lists, but parser on Maybe to Parser on list. Let us notate the corresponding natural transformation with <math>\Lambda\eta</math>: | ||
| - | :To each <math>X \in \mathbf{Ob}(\mathcal C)</math> we associate <math>(\Lambda\eta)_X \in \mathrm{Hom}_{\mathcal D}(\Lambda\Phi)(X),\;(\Lambda\Psi)(X))</math> | + | :To each <math>X \in \mathbf{Ob}(\mathcal C)</math> we associate <math>(\Lambda\eta)_X \in \mathrm{Hom}_{\mathcal D}((\Lambda\Phi)(X),\;(\Lambda\Psi)(X))</math> |
:<math>\Lambda\eta : \Lambda\Phi \to \Lambda\Psi</math> | :<math>\Lambda\eta : \Lambda\Phi \to \Lambda\Psi</math> | ||
:<math>(\Lambda\eta)_X = \Lambda(\eta_X)</math> | :<math>(\Lambda\eta)_X = \Lambda(\eta_X)</math> | ||
| Line 243: | Line 243: | ||
* [http://haskell.org/hawiki/CategoryTheory_2fNaturalTransformation?action=highlight&value=natural+transformation The corresponding HaWiki article] is not migrated here yet, so You can see it for more information. | * [http://haskell.org/hawiki/CategoryTheory_2fNaturalTransformation?action=highlight&value=natural+transformation The corresponding HaWiki article] is not migrated here yet, so You can see it for more information. | ||
* Wikipedia's [http://en.wikipedia.org/wiki/Natural_transformation Natural transformation] article | * Wikipedia's [http://en.wikipedia.org/wiki/Natural_transformation Natural transformation] article | ||
| + | * [http://www.case.edu/artsci/math/wells/pub/ttt.html Toposes, Triples and Theories] written by Michael Barr and Charles Wells. | ||
[[Category:Theoretical foundations]] | [[Category:Theoretical foundations]] | ||
Current revision
map even $ maybeToList $ Just 5
yields the same as
maybeToList $ fmap even $ Just 5
yields: both yield
[False]
In the followings, this example will be used to illustrate the notion of natural transformation. If the examples are exaggerated and/or the definitions are incomprehensible, try #External links.
Contents |
1 Definition
- Let
,
denote categories.
- Let
be functors.
- Let
. Let
.
Let us define the
natural transformation. It associates to each object of
a morphism of
in the following way (usually, not sets are discussed here, but proper classes, so I do not use term “function” for this
mapping):
-
. We call ηA the component of η at A.
-
Thus, the following diagram commutes (in
):
2 Example: maybeToList
As already mentioned
map even $ maybeToList $ Just 5
yields the same as
maybeToList $ fmap even $ Just 5
yields: both yield
[False]
This example will be shown in the light of the above definition in the followings.
2.1 Vertical arrows: sides of objects
… showing how the natural transformation works.
maybeToList :: Maybe a -> [a]
2.1.1 Left: side of X object
| maybeToList :: Maybe Int -> [Int] | |
| Nothing | [] |
| Just 0 | [0] |
| Just 1 | [1] |
2.1.2 Right: side of Y object
| maybeToList :: Maybe Bool -> [Bool] | |
| Nothing | [] |
| Just True | [True] |
| Just False | [False] |
2.2 Horizontal arrows: sides of functors
even :: Int -> Bool
2.2.1 Side of Φ functor
| fmap even:: Maybe Int -> Maybe Bool | |
| Nothing | Nothing |
| Just 0 | Just True |
| Just 1 | Just False |
2.2.2 Side of Ψ functor
| map even:: [Int] -> [Bool] | |
| [] | [] |
| [0] | [True] |
| [1] | [False] |
2.3 Commutativity of the diagram
both paths span between
Maybe Int -> [Bool] | ||
| map even . maybeToList | maybeToList . fmap even | |
| Nothing | [] | [] |
| Just 0 | [True] | [True] |
| Just 1 | [False] | [False] |
2.4 Remarks
- has a more general type (even) than described hereIntegral a => a -> Bool
- Words “side”, “horizontal”, “vertical”, “left”, “right” serve here only to point to the discussed parts of a diagram, thus, they are not part of the scientific terminology.
- If You want to modify the commutative diagram, see its source code (in LaTeX using
amscd).
3 Operations
3.1 Mixed
The “mixed” operations described below will be important also in understanding the definition of “monad” concept in category theory.
3.1.1 Functor and natural transformation
Let us imagine a parser library, which contains functions for parsing a form. There are two kinds of cells:
- containing data which are optional (e.g. name of spouse)
- containing data which consist of an enumeration of items (e.g. names of acquired languages)
spouse :: Parser (Maybe String) languages :: Parser [String]
Let us imagine we have any processing (storing, archiving etc.) function which processes lists (or any other reason which forces us to convert our results to list format and exclude any Maybe's). (Perhaps, all this example is impractical and exaggerated, because in real life we should solve the whole thing in other ways.)
Thus, we want to build a parser combinator (we could notate it graphically with something like
) which converts a “zero-ore-one-occurrence” like parser to a “zero-or-one-or-many-occurrences” like parser.
fmap maybeToList spouseLet us see the types: We start with
spouse :: Parser (Maybe String)
- Λ(Φ(X))
or using notion of composing functors
- (ΛΦ)(X)
We want to achieve
fmap maybeToList spouse :: Parser [String]
- Λ(Ψ(X))
- (ΛΨ)(X)
thus we can infer
fmap maybeToList :: Parser (Maybe [String]) -> Parser [String]
In fact, we have a new “datatype converter”: converting not Maybe's to lists, but parser on Maybe to Parser on list. Let us notate the corresponding natural transformation with Λη:
- To each
we associate
- (Λη)X = Λ(ηX)
Summary:
- Let
be categories
functors
functor
natural transformation
Then let us define a new natural transformation:
- (Λη)X = Λ(ηX)
3.1.2 Natural transformation and functor
- Let
be categories
functor
functors
natural transformation
Then let us define a new natural transformation:
- (ηΔ)X = ηΔ(X)
It can be illustrated by Haskell examples, too. Understanding it is made harder (easier?) by the fact that Haskell's type inference “(dis)solves” the main point, thus there is no “materialized” manifestation of it.
convert :: Maybe (Term a) -> [Term a]
Unlike seen at
, the definition of this converter will not show much novelty:
convert = maybeToListthe most interesting thing is done automatically by type inference.
4 External links
- The corresponding HaWiki article is not migrated here yet, so You can see it for more information.
- Wikipedia's Natural transformation article
- Toposes, Triples and Theories written by Michael Barr and Charles Wells.

