Проблема в том, что вы скрываете определение 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
.