Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔等价于Boost.Fusion_Haskell_Boost Fusion - Fatal编程技术网

Haskell 哈斯克尔等价于Boost.Fusion

Haskell 哈斯克尔等价于Boost.Fusion,haskell,boost-fusion,Haskell,Boost Fusion,我一直在尝试使用GADTs等在Haskell中创建一个完全类型的DSEL,以实现完全类型安全的AST,而要实现一个正确类型的编译器,似乎需要一些构造,例如从Haskell类型到类型和值(类型化环境)的映射,以及Haskell类型系统可以理解的构造。C++具有这样的构造(类型->值映射、类型值向量等)的Boosix.Fusion库。Data.Tuple负责序列,但是是否有类似Boost.Fusion的Haskell版本maps?您正在寻找,以及列表?(例如,[Int])。查看包装。我自己没用过,但

我一直在尝试使用GADTs等在Haskell中创建一个完全类型的DSEL,以实现完全类型安全的AST,而要实现一个正确类型的编译器,似乎需要一些构造,例如从Haskell类型到类型和值(类型化环境)的映射,以及Haskell类型系统可以理解的构造。C++具有这样的构造(类型->值映射、类型值向量等)的Boosix.Fusion库。Data.Tuple负责序列,但是是否有类似Boost.Fusion的Haskell版本
map
s?

您正在寻找,以及列表?(例如,
[Int]
)。

查看包装。我自己没用过,但它似乎能满足你的要求。如果您真的需要使用类型(和仅类型)相等,那么您可能需要同意默认值,或者使用
TypeRep
作为键。

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

现在,您可以使用类似于
insertT(undefined::Int)5的代码来按类型插入元素

但是看看Fusion,这看起来不像你想要的。它似乎允许您构建在任意数据结构上工作的代码?这在Haskell中被称为“废弃样板”通用编程。有关详细信息,请参见或,但它允许您编写代码来处理任意数据结构并选择给定类型的值


我在Fusion中看到的其他一些东西可能可以使用库(如或可能)进行模拟。但是,如果不看一下您实际需要什么,就很难说得更多。

如前所述,
依赖映射
似乎是事物映射端的正确选择,但我建议查看
hlist
的接口,作为手动处理元组的替代方法。

否,因为元素需要有不同的类型,这里的键是类型。我想要在一个值(不是一个提供全局映射的类型类)中实现像
(Int->5,Float->“foo”)
这样的映射。我知道如何手写(我想),但我想知道是否有人已经写过了。@NathanHowell:你能把这个作为答案吗?我会查一查,但从文档上看,这正是我想要的。否决票的原因是什么?当你描述一个“编译器”时,你从/到编译的是什么表示?如果你有GADT,你真的是在为它编写解释器,还是在为GADT编写一个函数,例如C代码?或者——在任何将键入的AST翻译成其他内容或运行它的事情中都会出现同样的问题。是的,为什么会投反对票?对我来说似乎是个好问题……只是出于好奇——这也许不是论坛,但我认为这个问题没有你想象的那么多?但是,请看一看:您的
TypeMap
可以工作,但需要
unsafeccerce
来说服编译器右侧的类型与左侧的
TypeRep
匹配(或
Data.Dynamic
)。HList看起来也很有趣;fclabels看起来更像是提供拉链。我不需要对任意数据类型进行反射/数据泛型编程,因此我认为SYB不会有帮助。我不确定您是否希望所讨论的值具有其索引类型。如果需要,您可能应该使用
HList
(如果您静态地知道地图的键),或者在值中使用
Dynamic
来构建类似的地图,以绕过
unsafeccerce
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)