-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcatamorphism.cabal
76 lines (73 loc) · 2.94 KB
/
catamorphism.cabal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
name: catamorphism
version: 0.7.0.0
synopsis: Exposes a Template Haskell function for generating catamorphisms.
description:
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) (+)
homepage: https://github.com/frerich/catamorphism
license: BSD3
license-file: LICENSE
author: Frerich Raabe
maintainer: [email protected]
bug-reports: https://github.com/frerich/catamorphism/issues
copyright: Copyright (c) 2014, 2015, 2016, 2017, 2018 Frerich Raabe <[email protected]>
category: Development
build-type: Simple
cabal-version: >=1.10
stability: experimental
source-repository head
type: git
location: https://github.com/frerich/catamorphism
library
exposed-modules: Data.Morphism.Cata
build-depends: base >=4.6 && <4.12, template-haskell >=2.8 && <2.14
hs-source-dirs: src
default-language: Haskell2010
ghc-options: -Wall
test-suite spec
type: exitcode-stdio-1.0
main-is: Tests.hs
hs-source-dirs: test
ghc-options: -Wall
build-depends: base, catamorphism, hspec, QuickCheck
other-modules: Data.Morphism.CataSpec
default-language: Haskell2010