【问题标题】:How do I declare a map type in Reason ML?如何在 Reason ML 中声明地图类型?
【发布时间】:2018-02-16 16:12:33
【问题描述】:

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

但是,我找不到这方面的使用示例。

例如,我如何声明一个类型scores,它是字符串到整数的映射?

/* Something like this */
type scores = Map<string, int>; 

我将如何构造一个实例?

/* Something like this */
let myMap = scores();

let myMap2 = myMap.set('x', 100);

【问题讨论】:

    标签: dictionary ocaml reason reasonml


    【解决方案1】:

    标准库Map 在编程语言世界中实际上是非常独特的,因为它是一个模块函子,您必须使用它来为您的特定键类型(和the API reference documentation is therefore found under Map.Make)构造一个映射模块:

    module StringMap = Map.Make({
      type t = string;
      let compare = compare
    });
    
    type scores = StringMap.t(int);
    
    let myMap = StringMap.empty;
    let myMap2 = StringMap.add("x", 100, myMap);
    

    您可以使用其他数据结构来构建类似地图的功能,特别是如果您需要专门的字符串键。有a comparison of different methods in the BuckleScript Cookbook。除了 Js.Dict 之外的所有内容都可以在 BuckleScript 之外使用。 BuckleScript 还附带了a new Map data structure in its beta standard library,我还没有尝试过。

    【讨论】:

    • 所以键类型是在“模块函子”中定义的(这对我来说是一个新概念),值类型被定义为t函数的类型参数?你能分享为什么它分两个阶段实施吗?来自 F# 这似乎很奇怪。
    • StringMap.t 是具有类型参数的类型,而不是严格意义上的函数,尽管从概念上讲,您可以(并且应该!)将其视为类型之上的函数。类似地,模块函子只是模块之上的函数,它接受一个(或多个)模块并返回一个模块。
    • 我不完全确定为什么它被实现为仿函数,但一个可能的动机仅仅是因为你可以。在 F# 中我不认为你可以,因为模块系统不够强大。对于不可变的数据结构,它可能还使实现更清晰,性能略高,内存占用更少,因为如果没有“硬编码”比较函数,您必须将它放在每次都必须复制的包装器中在地图中添加或删除节点。
    • 另一个重要的一点是map的类型应该取决于key类型和比较函数。否则,可能会尝试合并使用不同比较函数构建的两个映射,从而导致完全不稳定的行为。 Functor 提供了一种很好的方法来使映射类型依赖于整个参数模块,包括比较函数。实现此结果的其他简洁方法更为复杂(参见 Janestreet 的 Base.Map 模块)
    【解决方案2】:

    如果您只是与Map&lt;string, int&gt; 打交道,Belt 的Map.String 就可以解决问题。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      相关资源
      最近更新 更多