Difference between revisions of "TypeCompose"

From HaskellWiki
Jump to navigation Jump to search
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 `O` 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.
+
* 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:

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.