【问题标题】:ReasonML cycle dependencyReasonML 循环依赖
【发布时间】:2019-12-12 01:56:19
【问题描述】:

我正在基于 this project 将 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";
};

很遗憾,我收到 未绑定模块层 错误。

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

【问题讨论】:

    标签: module dependencies ocaml reason bucklescript


    【解决方案1】:

    选项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";
    };
    

    选项 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";
    };
    

    【讨论】:

    • @Yvain - 很酷的快捷方式——如果模块是递归的并且只定义类型和外部,你可以让它们引用自己:module rec Map: {...} = Map and Layer: {...} = Layer;
    猜你喜欢
    • 2010-09-12
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多