# TypeCompose

### From HaskellWiki

(Difference between revisions)

m (→Data-driven computation: fixed name bug) |
m (→Data-driven computation: "Compose" --> "O") |
||

Line 19: | Line 19: | ||

<haskell> | <haskell> | ||

− | type DataDrivenG news src = | + | type DataDrivenG news src = (,) news `O` src |

</haskell> | </haskell> | ||

− | Thanks to properties of [http://darcs.haskell.org/packages/TypeCompose/doc/html/Control-Compose.html#t% | + | Thanks to properties of type composition ([http://darcs.haskell.org/packages/TypeCompose/doc/html/Control-Compose.html#t%3AO <hask>O</hask>]), when <hask>news</hask> is a [http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Monoid.html#t%3AMonoid monoid] and <hask>src</hask> is an [http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Applicative.html#t%3AApplicative applicative functor], <hask>DataDriven news src</hask> is an applicative functor also. The applicative property is very convenient for composition. |

To see how our simple definitions manage data-driven computations, expand the <hask>Applicative</hask> instances of <hask>Compose</hask> and <hask>(,) a</hask>: | To see how our simple definitions manage data-driven computations, expand the <hask>Applicative</hask> instances of <hask>Compose</hask> and <hask>(,) a</hask>: |

## Revision as of 22:46, 31 July 2007

## Contents |

## 1 Abstract

**TypeCompose** provides some classes & instances for forms of type composition. It also includes a very simple implementation of data-driven computation.

- Read the Haddock docs (with source code, additional examples, and Comment/Talk links).
- Get the code repository:
, or`darcs get http://darcs.haskell.org/packages/TypeCompose` - Grab a distribution tarball.
- See the version changes.

TypeCompose is used in Phooey, a functional GUI library.

## 2 Type composition

For now, see the Haddock docs and source code.

## 3 Data-driven computation

The representation of data-driven computations is quite simple and general. They have a*news*publisher (

news

src

news

src

type DataDrivenG news src = (,) news `O` src

O

news

src

DataDriven news src

Applicative

Compose

(,) a

instance (Applicative src) => Applicative (DataDrivenG news src) where pure a = Comp (mempty, pure a) Comp (newsf,srcf) <*> Comp (newsx, srcx) = Comp (newsf `mappend` newsx) (srcf <*> srcx)

mempty

mappend

DataDrivenG

src

### 3.1 Specializing

Specializing, introduce types of "updaters" (actions), "sinks" (consumers) of values, and "news publishers" (somewhere to register updaters to be executed when events occur).

type Updater src = src () type Sink src a = a -> Updater src type News src = Sink src (Updater src)

DataDriven

type DataDriven src = DataDrivenG (News src) src

For instance, the "Source" types used in Phooey are defined simply as

type Source = DataDriven IO

News src

src ()

f

-- Standard instance: Applicative functor applied to monoid instance Monoid a => Monoid (f a) where { mempty = pure mempty; mappend = (*>) }

()

Control.Instances