首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost.Fusion的Haskell等价物

Boost.Fusion的Haskell等价物
EN

Stack Overflow用户
提问于 2011-11-30 01:09:01
回答 4查看 456关注 0票数 10

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-30 01:51:47

看看dependent-map包。我自己还没用过,但它似乎能满足你的要求。如果您真的需要使用类型(且仅限类型)相等,那么您可能需要同意一个默认值或使用TypeRep作为键。

票数 10
EN

Stack Overflow用户

发布于 2011-11-30 01:57:29

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

代码语言:javascript
复制
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中,这就是所谓的“废弃你的样板”泛型编程。有关详细信息,请参阅papershackage,但它允许您编写处理任意数据结构并挑选给定类型的值的代码。

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

票数 4
EN

Stack Overflow用户

发布于 2011-11-30 03:58:55

正如前面提到的,dependent-map似乎是地图方面的正确选择,但我建议使用hlistHArray接口作为手动处理元组的替代方案。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8314780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档