Personal tools

TypeCompose

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
m (Type composition: "O" --> ":.")
m (Pair- & function-like types)
Line 39: Line 39:
 
=== Pair- & function-like types ===
 
=== Pair- & function-like types ===
   
The <hask>Data.Pair</hask> and <hask>Data.Lambda</hask> patterns emerged while working on [[DeepArrow]] and [[Eros]]. <hask>Data.Pair</hask> generalizes <hask>zip</hask> and <hask>unzip</hask> from <hask>[]</hask> to other functors. It also provides variants of type <hask>f a -> f (a,b)</hask> and <hask>f a -> f (a,b)</hask>. <hask>Data.Lambda</hask> is similar with classes for lambda-like constructions.
+
The <hask>Data.Pair</hask> and <hask>Data.Lambda</hask> patterns emerged while working on [[DeepArrow]] and [[Eros]]. <hask>Data.Pair</hask> generalizes <hask>zip</hask> and unzip from <hask>[]</hask> to other functors. It also provides variants of type <hask>f a -> f (a,b)</hask> and <hask>f a -> f (a,b)</hask>. <hask>Data.Lambda</hask> is similar with classes for lambda-like constructions.
   
 
For example uses of <hask>Pair</hask> and <hask>Lambda</hask>, see [[TV]] and [[Eros]].
 
For example uses of <hask>Pair</hask> and <hask>Lambda</hask>, see [[TV]] and [[Eros]].

Revision as of 22:30, 18 December 2007


Contents

1 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.

2 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
    .

3 Other features

3.1 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.

3.2 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.

3.3 References

Monads with references. Direct rip-off from Global Variables in Haskell.

3.4 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.

3.5 Partial values

A monoid of partial values. See the teaser and solution blog posts.

3.6 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.