即使This expression has type float but an expression was expected of type ModuleA.t
和ModuleA.t
如float
中所定义,以下代码也会产生类型错误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
,则类型错误消失了。如何在保持模块类型定义的同时解决类型错误?
答案 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>