Construct inalg generically

- ADTs are fix points of polynomial functors, such fix points can be
  constructed syntactically
- implementation: https://www.haskell.org/haskellwiki/Catamorphisms