Dictionary 如何在Reason ML中声明映射类型?

Dictionary 如何在Reason ML中声明映射类型?,dictionary,ocaml,reason,reasonml,Dictionary,Ocaml,Reason,Reasonml,Reason ML优于JavaScript的一个优点是,它提供了一种使用结构相等而不是引用相等的映射类型 然而,我找不到这种用法的例子 例如,如何声明字符串到整数的映射类型 /* Something like this */ type scores = Map<string, int>; 标准库映射实际上在编程语言世界中非常独特,因为它是一个模块函子,您必须使用它为特定的键类型构造映射模块,并且: 模块StringMap=Map.Make{ 类型t=字符串; 让我们比较一下 };

Reason ML优于JavaScript的一个优点是,它提供了一种使用结构相等而不是引用相等的映射类型

然而,我找不到这种用法的例子

例如,如何声明字符串到整数的映射类型

/* Something like this */
type scores = Map<string, int>; 
标准库映射实际上在编程语言世界中非常独特,因为它是一个模块函子,您必须使用它为特定的键类型构造映射模块,并且:

模块StringMap=Map.Make{ 类型t=字符串; 让我们比较一下 }; 类型分数=StringMap.tint; 让myMap=StringMap.empty; 设myMap2=StringMap.addx,100,myMap;
您还可以使用其他数据结构来构造类似于地图的功能,特别是当您特别需要字符串键时。有。除了Js.Dict之外的所有脚本都可以在BuckleScript之外使用。BuckleScript也提供了我还没有尝试过的功能。

如果你只是在处理地图,Belt的Map.String就可以了

module MS = Belt.Map.String;

let foo: MS.t(int) = [|("a", 1), ("b", 2), ("c", 3)|]->MS.fromArray;

腰带版本的人体工程学设计稍微不那么痛苦,而且它们是引导时不变的地图!腰带里还有Map.Int。对于其他键类型,您必须定义自己的比较器。这又回到了类似于上面详述的两步过程@glennsl的地方。

那么键类型是在模块函子中定义的,这对我来说是一个新概念,值类型是定义为t函数的类型参数吗?你能分享一下为什么它分两个阶段实施吗?来自F这似乎很奇怪。StringMap.t是一个带有类型参数的类型,而不是严格意义上的函数,尽管在概念上您可以而且应该这样做!将其视为类型之上的函数。类似地,模块函子只是模块上的一个函数,它接受一个或多个模块并返回一个模块。我不完全确定它为什么被实现为函子,但一个可能的动机就是因为你可以。在F中,我认为你不能,因为模块系统不够强大。对于不可变的数据结构,它还可能使实现更干净,性能更高,占用内存更少,因为如果不硬编码比较函数,您必须在每次添加或从映射中删除节点时都要复制的包装器中携带比较函数。另一个重要的问题是映射的类型应该取决于键类型和比较函数。否则,可能会尝试合并使用不同比较函数构建的两个映射,从而导致完全不稳定的行为。Functor提供了一种很好的方法,使映射类型依赖于整个参数模块,包括比较函数。实现此结果的其他干净方法是更复杂的,例如Janestreet的Base.Map模块
module MS = Belt.Map.String;

let foo: MS.t(int) = [|("a", 1), ("b", 2), ("c", 3)|]->MS.fromArray;