我一直在尝试使用GADT等在Haskell中创建一个完全类型安全的AST的全类型DSEL,似乎做一个正确类型的编译器需要构造从Haskell类型到类型和值(类型化环境)的映射,以及可以被Haskell类型系统理解的结构。C++有一个Boost.Fusion库,它具有这样的结构(类型->值映射,类型化值的向量,等等)。Data.Tuple负责处理序列,但是像Boost.Fusion maps这样的东西有没有Haskell版本呢?
发布于 2011-11-30 01:51:47
看看dependent-map包。我自己还没用过,但它似乎能满足你的要求。如果您真的需要使用类型(且仅限类型)相等,那么您可能需要同意一个默认值或使用TypeRep作为键。
发布于 2011-11-30 01:57:29
首先,显而易见的答案是,您可以使用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中,这就是所谓的“废弃你的样板”泛型编程。有关详细信息,请参阅papers或hackage,但它允许您编写处理任意数据结构并挑选给定类型的值的代码。
我在Fusion中看到的其他一些东西可能可以使用诸如HList或fclabels之类的库来模拟。但如果不看一眼你真正需要的是什么,就很难说得更多。
发布于 2011-11-30 03:58:55
正如前面提到的,dependent-map似乎是地图方面的正确选择,但我建议使用hlist的HArray接口作为手动处理元组的替代方案。
https://stackoverflow.com/questions/8314780
复制相似问题