解决由模块类型间接产生的类型错误

时间:2019-02-06 04:41:17

标签: types module ocaml

即使This expression has type float but an expression was expected of type ModuleA.tModuleA.tfloat中所定义,以下代码也会产生类型错误ModuleA

module type ModuleT =
  sig
    type t
    val to_string : t -> string
  end

module ModuleA : ModuleT =
  struct
    type t = float
    let to_string x = string_of_float x
  end

let () =
  let x = 3.0 in
  Printf.printf "%s\n" (ModuleA.to_string x)

如果我没有定义模块类型ModuleT,而是仅定义ModuleA,则类型错误消失了。如何在保持模块类型定义的同时解决类型错误?

1 个答案:

答案 0 :(得分:2)

问题是您在t中隐藏了ModuleT的定义,鉴于问题中没有约束,显而易见的解决方案是完全定义它:

module type ModuleT =
  sig
    type t = float
    val to_string : t -> string
  end

但是首先取决于定义ModuleT的原因,此解决方案可能不合适。例如,使用您定义的ModuleT,可以为ModuleB提供以下定义:

module ModuleB : ModuleT =
  struct
    type t = int
    let to_string x = string_of_int x
    let make : int -> t = fun n -> n
  end

let () =
  let x = 3 in
  Printf.printf "%s\n" (ModuleB.to_string (ModuleB.make x))

如果t中的ModuleT被约束为float,则您不能这样做,因为int显然不会与float统一。 / p>