решение ошибок типа, вызванных косвенным воздействием типа модуля - PullRequest
0 голосов
/ 06 февраля 2019

Следующий код выдает ошибку типа 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, ошибка типа исчезла.Как я могу решить ошибку типа, сохраняя определение типа модуля?

1 Ответ

0 голосов
/ 06 февраля 2019

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

...