shapely-data is a library for working with algebraic datatypes in a
simple generic form made up of haskell's primitive product, sum and unit
types: `(,)`, Either, and `()`, providing something like light-weight
Structural Typing.
The library was not designed to facilitate generic traversals or
abstraction over different recursion schemes, but rather to (from most to
least important)
Provide a good story for (,)Either as a lingua franca/ generic
representation that other library writers can use without dependencies,
encouraging abstractions in terms of products and sums
Support algebraic operations on ADTs, making types composable
Support powerful, typed conversions between Shapely types
Influences
I've taken lots of inspiration, code, names, ideas, and type-level
programming techniques from, in particular
Oleg Kiselyov's HList work
Edward Kmett's "categories" package
Chris Taylor's "Algebra of Algebraic Datatypes" series at
http://chris-taylor.github.io/blog/2013/02/10/the-algebra-of-algebraic-data-types/
Issues and Limitations:
massage does not support mutually-recursive types and other more
complicated recursion schemes, nor type application.
While all classes except Shapely are considered closed, we don't do any
tricks to enforce that in the API yet.
In fancier functions that use type equality (e.g. coerce), types need to
be unambiguous so type signatures are sometimes required.
type errors, especially in massage and coerce, can be cryptic
TH deriving hasn't been considered for fancier types like GADTs,
existential types, etc. some of which may have sensible Shapely instances
Performance hasn't been tested at all yet.