TypeCompose: Difference between revisions
m (→Abstract) |
m (→Type composition: "O" --> ":.") |
||
Line 23: | Line 23: | ||
The <hask>Control.Compose</hask> module includes | The <hask>Control.Compose</hask> module includes | ||
* Various type compositions (unary/unary, binary/unary, etc). Most are from [http://www.soi.city.ac.uk/~ross/papers/Applicative.html Applicative Programming with Effects]. In particular, <hask>g | * Various type compositions (unary/unary, binary/unary, etc). Most are from [http://www.soi.city.ac.uk/~ross/papers/Applicative.html Applicative Programming with Effects]. In particular, <hask>g :. f</hask> composes functors in to functors and applicative functors (AFs) into AFs. (In contrast, monads do not in general compose.) Composition makes AF-based programming simple and elegant, partly because we don't need an AF counterpart to monad transformers. | ||
* Cofunctors (contravariant functors). Great for "consumer" types, just as functors suit "producer" (container) types. There are several composition options. | * Cofunctors (contravariant functors). Great for "consumer" types, just as functors suit "producer" (container) types. There are several composition options. | ||
* Type argument flip. Handy for cofunctors: use <hask>Flip (->) o</hask>, for <hask>(-> o)</hask>. | * Type argument flip. Handy for cofunctors: use <hask>Flip (->) o</hask>, for <hask>(-> o)</hask>. |
Revision as of 22:24, 18 December 2007
Abstract
Warning: The Haddock docs are out of date. I'm trying to get a working haddock 2.0 running (on my windows machine).
TypeCompose provides some classes & instances for forms of type composition, as well as some modules that haven't found another home.
Besides this wiki page, here are more ways to learn about TypeCompose:
- Read the Haddock docs (with source code, additional examples, and Comment/Talk links).
- Get the code repository: darcs get http://darcs.haskell.org/packages/TypeCompose, or
- Grab a distribution tarball.
- See the version history.
- See the use of TypeCompose in DataDriven.
Please leave comments at the Talk page.
Type composition
The Control.Compose
module includes
- Various type compositions (unary/unary, binary/unary, etc). Most are from Applicative Programming with Effects. In particular,
g :. f
composes functors in to functors and applicative functors (AFs) into AFs. (In contrast, monads do not in general compose.) Composition makes AF-based programming simple and elegant, partly because we don't need an AF counterpart to monad transformers. - Cofunctors (contravariant functors). Great for "consumer" types, just as functors suit "producer" (container) types. There are several composition options.
- Type argument flip. Handy for cofunctors: use
Flip (->) o
, for(-> o)
. - Constructor in pairs:
(f a, g a)
. - Constructor in arrows/functions:
f a ~> g a
.
Other features
Composable bijections
Given all the type constructors and compositions of them, I found myself writing some pretty awkward code to wrap & unwrap through multiple layers. Composable bijections help a lot.
The Data.Bijection
module is inspired by There and Back Again: Arrows for Invertible Programming, though done here in a less general setting.
Pair- & function-like types
The Data.Pair
and Data.Lambda
patterns emerged while working on DeepArrow and Eros. Data.Pair
generalizes zip
and unzip
from []
to other functors. It also provides variants of type f a -> f (a,b)
and f a -> f (a,b)
. Data.Lambda
is similar with classes for lambda-like constructions.
For example uses of Pair
and Lambda
, see TV and Eros.
References
Monads with references. Direct rip-off from Global Variables in Haskell.
Titling
For giving titles to things. I know it sounds kind of random. More useful than I first thought. Used in Phooey, TV, and Eros.
Partial values
A monoid of partial values. See the teaser and solution blog posts.
Context-dependent monoids
Bit of an oddball also. Data.CxMonoid
defines a sort of meta-monoid, that can be supplied dynamically with choices of mempty
and mappend
. Used in Phooey (starting with version 1.3) so that layout could be a monoid but still vary in style.