我一直在使用GADT在Haskell中创建一个完全类型化的DSEL,对于一个完全类型安全的AST,似乎做一个正确类型化的编译器需要构造,例如从Haskell类型到类型和值的映射(类型化的环境)以及Haskell类型系统可以理解的类型。 C ++具有Boost.Fusion库,其中包含类似这些结构(类型 - >值映射,类型值向量等)。 Data.Tuple负责处理序列,但是有没有Hostell版本的东西,比如Boost.Fusion map
s?
答案 0 :(得分:10)
查看dependent-map包。我自己没有用过它,但它似乎做了你要求的。如果您需要真正使用类型(和仅类型)相等,那么您可能需要同意默认值或使用TypeRep
作为键。
答案 1 :(得分:4)
首先,非常明显的答案是您可以使用Typeable
(基础库的一部分)轻松编写“type-> value map”:
import Data.Typeable
import Data.Map
type TypeMap a = Map TypeRep a
insertT :: Typeable k => k -> a -> Map k a -> Map k a
insertT v = insert (typeOf k)
lookupT :: Typeable k => k -> a -> Map k a -> Map k a
lookupT v = lookup (typeOf k)
现在,您可以使用insertT (undefined :: Int) 5
之类的代码按类型插入元素。
但是看看Fusion,这看起来并不像你可能会追求的那样。它似乎允许您构建处理任意数据结构的代码?这就是Haskell中被称为“Scrap your Boilerplate”的通用编程。有关详细信息,请参阅papers或hackage,但它允许您编写处理任意数据结构的代码并选择给定类型的值。
我看到Fusion的其他一些内容可能会使用HList或fclabels等库来模拟。但是,如果不了解你真正需要的东西,真的很难说更多。
答案 2 :(得分:3)
如前所述,dependent-map
似乎是地图方面的正确选择,但我建议您查看hlist
的{{3}}界面作为手动玩杂耍的替代方法元组。
答案 3 :(得分:1)
您在寻找Data.Map和列表吗? (例如[Int]
)。