关于模块:ReasonML周期依赖性

ReasonML cycle dependency

我正在基于该项目来研究与leafletjs绑定的扣环脚本。

使用Leaflet,地图具有添加图层的功能,而图层具有将自身添加至地图的功能。

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

1
2
3
4
5
6
7
8
9
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";
};

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

如何使编译器知道后面介绍的类型?


选项1:在通用模块中定义类型并为其加上别名:

1
2
3
4
5
6
7
8
9
10
11
12
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";
};

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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";
};