# catamorphism: Exposes a Template Haskell function for generating catamorphisms.

This module exposes a `makeCata`

function which can create catamorphisms for
arbitrary Haskell types. Catamorphisms are functions which deconstruct some
value by replacing each data constructor with a custom function yielding a
new value. See http://www.haskell.org/haskellwiki/Catamorphisms for a more
in-depth discussion of catamorphisms in Haskell.

The Haskell base package already comes with a couple of standard
catamorphisms, such as `maybe`

(for `Maybe`

values). The `maybe`

function
could have been generated using `makeCata`

as follows:

-- Defines 'maybe :: b -> (a -> b) -> Maybe a -> b' $(makeCata defaultOptions ''Maybe)

However, catamorphisms are especially useful for recursive data structures. Consider the following simple example which defines a basic data type for modelling sums of numbers, supporting variables:

import Data.Morphism.Cata import Data.Maybe (fromJust) data Expr a = Number a | Variable Char | Sum (Expr a) (Expr a) -- Defines 'expr :: (a -> b) -> (Char -> b) -> (b -> b -> b) -> Expr a -> b' $(makeCata defaultOptions ''Expr)

The `makeCata`

invocation defines a `expr`

function which works like a fold on
`Expr`

values; it can be used to implement various useful other functions:

-- Evaluate an Expr, given some variable bindings eval :: Num a => [(Char, a)] -> Expr a -> a eval vars = expr id (fromJust . (`lookup` vars)) (+) -- Pretty-prints an Expr pprint :: Show a => Expr a -> String pprint = expr show show (\a b -> a ++ " + " ++ b) -- Counts the number of variables used in an expr numVars :: Expr a -> Int numVars = expr (const 1) (const 0) (+)

Versions [RSS] [faq] | 0.3.0.0, 0.4.0.0, 0.4.0.1, 0.5.0.0, 0.5.0.1, 0.5.1.0, 0.6.0.0, 0.6.1.0, 0.6.1.1, 0.7.0.0 |
---|---|

Dependencies | base (>=4.6 && <4.12), template-haskell (>=2.8 && <2.14) [details] |

License | BSD-3-Clause |

Copyright | Copyright (c) 2014, 2015, 2016, 2017, 2018 Frerich Raabe <frerich.raabe@gmail.com> |

Author | Frerich Raabe |

Maintainer | frerich.raabe@gmail.com |

Category | Development |

Home page | https://github.com/frerich/catamorphism |

Bug tracker | https://github.com/frerich/catamorphism/issues |

Source repo | head: git clone https://github.com/frerich/catamorphism |

Uploaded | by frerich at 2018-04-10T13:44:22Z |

Distributions | NixOS:0.7.0.0 |

Downloads | 5814 total (44 in the last 30 days) |

Rating | (no votes yet) [estimated by Bayesian average] |

Your Rating | |

Status | Docs available [build log] Last success reported on 2018-04-13 [all 1 reports] |

## Downloads

- catamorphism-0.6.1.1.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)

#### Maintainer's Corner

For package maintainers and hackage trustees

Candidates