Try a more expressive approach to types using GADTs
More Types
More Types: Modules
More Types