10

我一直在尝试使用 GADT 在 Haskell 中创建一个完全类型化的 DSEL,例如一个完全类型安全的 AST,似乎做一个正确类型化的编译器需要诸如从 Haskell 类型到类型和值(类型化环境)的映射之类的构造并且可以通过 Haskell 类型系统来理解。C++ 的 Boost.Fusion 库具有类似的结构(类型-> 值映射、类型化值的向量等)。Data.Tuple 负责处理序列,但是是否有 Haskell 版本的东西,例如 Boost.Fusion maps?

4

4 回答 4

10

查看依赖映射包。我自己没有使用过它,但它似乎可以满足您的要求。如果您需要真正使用类型(和仅类型)相等,那么您可能需要就默认值达成一致或使用 aTypeRep作为键。

于 2011-11-29T17:51:47.283 回答
4

首先,非常明显的答案是您可以使用Typeable(基础库的一部分)轻松编写“类型->值映射”:

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

我看到的其他一些关于 Fusion 的东西可能可以使用诸如HListfclabels 之类的库来模拟。但是如果不看看你真正需要什么,真的很难说更多。

于 2011-11-29T17:57:28.917 回答
3

如前所述,dependent-map这似乎是地图方面的正确选择,但我建议将HArray界面hlist作为手动处理元组的替代方案。

于 2011-11-29T19:58:54.963 回答
1

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

于 2011-11-29T17:11:08.900 回答