Sof*_*mur 6 constructor ocaml module
我已经定义了以下接口和模块:
module type TYPE =
  sig
    type t
  end
module Type = (struct
  type t =
    | TBot
    | T of int
    | TTop
end: TYPE)
现在我意识到如果我在外面写Type.T 5,编译器会给我错误Error: Unbound constructor Type.T.如果我删除签名并保留模块,则错误将消失.
1)所以我的第一个问题是,如何更改签名以便我可以在外部使用构造函数?
2)一种方法是如下明确定义构造函数,你认为它是一种传统方式吗?我现在可以看到的一个缺点是它不允许构造TBot或TTop.
module type TYPE =
  sig
    type t
    val make : int -> t
  end
module Type = (struct
  ...
  let make (i: int) : t =
      T i
end: TYPE)
3)是否总是需要让外部能够在模块内部构造一个值?
1)你必须导出类型声明,否则,t被认为是抽象的,然后你需要定义和导出构造函数(见2)):
module type TYPE = sig
  type t =
    | TBot
    | T of int
    | TTop
end
module Type : TYPE = struct
  type t =
    | TBot
    | T of int
    | TTop
end
2)是的,这是一个非常好的方式.要定义顶部和底部,您只需定义(和导出)新构造函数:
module type TYPE = sig
  ...
  val top: t
  val bot: t
end
module Type = struct
  ...
  let bot = TBot
  let top = TTop
end
3)我不明白你的问题
| 归档时间: | 
 | 
| 查看次数: | 1583 次 | 
| 最近记录: |