我对OCaml中的抽象类型有疑问。

假设我有一个隐藏某种类型的模块:

module Test : sig
  type t
  val make_t : unit -> t
end = struct
  type t = int option
  let make_t () = Some 42
end

我还有一个对可选函数进行操作的函数:
let do_work : 'a option -> unit = function
  | Some x -> Printf.printf "Some\n"
  | None   -> Printf.printf "None\n"

毫不奇怪,当我在t实例上调用do_work时,出现类型错误:
let () =
  do_work @@ Test.make_t ()

错误:此表达式的类型为Test.t,但应为'a option类型的表达式

在我的应用程序中,我没有比int选项更复杂的方法,并且我不想向外公开其内部。但是,我想告诉OCaml编译器t实际上是某种选择。我该如何实现?

最佳答案

最直接的方法是仅使选项的内容类型抽象:

module Test :
sig
  type t'
  type t = t' option
  val make_t : unit -> t
end =
struct
  type t' = int
  type t = t' option
  let make_t () = Some 42
end

关于types - Ocaml抽象类型和类型推断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44906193/

10-12 00:32
查看更多