我一直在使用GADTs创建一个完全类型的DSEL,并使用完全类型安全的AST,并且看起来,正确输入的编译器需要一些构造,例如
Haskell类型的映射到类型和值(类型化环境)并且这样可以被Haskell型系统所理解. C的Boost.Fusion库具有这样的结构(type->值映射,类型值的向量等). Data.Tuple负责处理序列,但是有一些Haskell版本的Boost.Fusion映射?
解决方法
看看
dependent-map包.我没有使用它,但它似乎做你要求的.如果您需要真正使用类型(和类型)相等,则可能需要同意默认值或使用TypeRep作为键.