【问题标题】:expose a private type for module extension in OCaml在 OCaml 中公开模块扩展的私有类型
【发布时间】:2017-09-01 11:03:36
【问题描述】:

我想扩展一个模块,但我需要访问它的私有组件。这是一个例子:

nat.mli:
type t 
val zero : t
val succ : t -> t

nat.ml:
type t = int
let zero = 0
let succ x = x + 1

我想定义一个新模块Ext_nat,它定义了一个double 函数。我试图做这样的事情。

ext_nat.mli:
include (module type of Nat)
val double : t -> t

ext_nat.ml:
include Nat
let double x = 2 * x

它不起作用,因为我无法访问最后一行中 x 的表示。

现在我正在考虑这个问题,无论如何这可能不是一个好主意,因为这会破坏nat 的封装。那么最好的方法是什么?我可以在签名中定义一个新模块nat_public,其中type t = int,并使用私有type t 定义natext_nat。你怎么看?

【问题讨论】:

    标签: module ocaml encapsulation inclusion


    【解决方案1】:

    您需要使用with type 语句。下面的代码可以有很多不同的写法,但是思路总是一样的。

    module type NatSig =
      sig
        type t
        val zero : t
        val succ : t -> t
      end
    
    module type ExtNatSig =
      sig
        include NatSig
        val double : t -> t
      end
    
    module ExtNat : ExtNatSig =
      struct
        type t = int
        let zero = 0
        let succ = fun x -> x + 1
        let double = fun x -> x * 2
      end
    
    module Nat = (ExtNat : NatSig with type t = ExtNat.t)
    
    let z = Nat.zero
    let _ = ExtNat.double z
    

    问题在于,据我所知,用你的文件结构是不可能实现这种行为的:你用 .mli 文件中的签名隐式定义你的模块,并在 .ml 中构建自身,所以你没有足够的控制权你这个模块,这就是为什么我建议你稍微重新组织你的代码(如果这不是问题的话)。

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2022-01-05
      • 2018-10-17
      • 2017-09-25
      • 1970-01-01
      相关资源
      最近更新 更多