我对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/