Haskell相当于Boost.Fusion

时间:2011-11-29 17:09:01

标签: haskell boost-fusion

我一直在使用GADT在Haskell中创建一个完全类型化的DSEL,对于一个完全类型安全的AST,似乎做一个正确类型化的编译器需要构造,例如从Haskell类型到类型和值的映射(类型化的环境)以及Haskell类型系统可以理解的类型。 C ++具有Boost.Fusion库,其中包含类似这些结构(类型 - >值映射,类型值向量等)。 Data.Tuple负责处理序列,但是有没有Hostell版本的东西,比如Boost.Fusion map s?

4 个答案:

答案 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”的通用编程。有关详细信息,请参阅papershackage,但它允许您编写处理任意数据结构的代码并选择给定类型的值。

我看到Fusion的其他一些内容可能会使用HListfclabels等库来模拟。但是,如果不了解你真正需要的东西,真的很难说更多。

答案 2 :(得分:3)

如前所述,dependent-map似乎是地图方面的正确选择,但我建议您查看hlist的{​​{3}}界面作为手动玩杂耍的替代方法元组。

答案 3 :(得分:1)

您在寻找Data.Map和列表吗? (例如[Int])。