ReasonML 循环依赖

Yva*_*ain 2 dependencies ocaml module reason bucklescript

我正在研究基于这个项目的 bucklescript 绑定到leafletjs 。

使用传单,地图具有添加图层的功能,而图层具有将自身添加到地图的功能。

这就是我想用 ReasonML 实现的目标:

module Map = {
    type t;
    [@bs.send] external addLayer : (t, Layer.t) => t = "addLayer";
};

module Layer = {
    type t;
    [@bs.send] external addTo : Map.t => unit = "addTo";
};
Run Code Online (Sandbox Code Playgroud)

不幸的是,我收到一个未绑定的模块层错误。

如何让编译器知道后面描述的类型?

gle*_*nsl 7

选项 1:在公共模块中定义类型并为其命名:

type map;
type layer;

module Map = {
    type t = map;
    [@bs.send] external addLayer : (t, layer) => t = "addLayer";
};

module Layer = {
    type t = layer;
    [@bs.send] external addTo : map => unit = "addTo";
};
Run Code Online (Sandbox Code Playgroud)

选项 2:使模块相互递归:

module rec Map : {
    type t;
    [@bs.send] external addLayer : (t, Layer.t) => t = "addLayer";
} = {
    type t;
    [@bs.send] external addLayer : (t, Layer.t) => t = "addLayer";
}

and  Layer : {
    type t;
    [@bs.send] external addTo : Map.t => unit = "addTo";
} = {
    type t;
    [@bs.send] external addTo : Map.t => unit = "addTo";
};
Run Code Online (Sandbox Code Playgroud)

  • @Yvain - 很酷的快捷方式——如果模块是递归的并且只定义类型和外部,你可以让它们引用自己:`module rec Map: {...} = Map and Layer: {...} = Layer;` (2认同)