compdata: Compositional Data Types

[ benchmark, bsd3, generics, library ] [ Propose Tags ]
Versions 0.1, 0.2, 0.3, 0.4, 0.4.1, 0.5, 0.5.1, 0.5.2, 0.5.3, 0.6, 0.6.1,,,,, 0.7,,, 0.8,,,,,, 0.9, 0.10, 0.10.1, 0.11
Dependencies base (==4.*), containers, criterion, deepseq, derive, mtl, QuickCheck (>=2), random, template‑haskell, test‑framework, test‑framework‑quickcheck2, th‑expand‑syns, uniplate [details]
License BSD-3-Clause
Author Patrick Bahr, Tom Hvitved
Category Generics
Uploaded by PatrickBahr at Thu Mar 24 14:23:38 UTC 2011
Distributions NixOS:0.11
Executables benchmark, test
Downloads 10955 total (91 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]
Hackage Matrix CI

Based on Wouter Swierstra's Functional Pearl Data types à la carte (Journal of Functional Programming, 18(4):423-436, 2008), this package provides a framework for defining recursive data types in a compositional manner. The fundamental idea of compositional data types is to separate the signature of a data type from the fixed point construction that produces its recursive structure. By allowing to compose and decompose signatures, compositional data types enable to combine data types in a flexible way. The key point of Wouter Swierstra's original work is to define functions on compositional data types in a compositional manner as well by leveraging Haskell's type class machinery.

Building on that foundation, this library provides additional extensions and (run-time) optimisations which makes compositional data types usable for practical implementations. In particular, it provides an excellent framework for manipulating and analysing abstract syntax trees in a type-safe manner. Thus, it is perfectly suited for programming language implementations, especially, in an environment consisting of a family of tightly interwoven domain-specific languages.

In concrete terms, this package provides the following features:

For examples illustrating the use of compositional data types, consult Data.Comp resp. Data.Comp.Multi for mutually recursive data types.





Build test executable.


Build benchmark executable.


Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info


Maintainer's Corner

For package maintainers and hackage trustees