OCAML与非原始数据类型构造函数的和类型

时间:2017-03-26 20:13:56

标签: types constructor sum ocaml

我想创建一个充当字典的和类型

type dict = Dict of Map.Make(String)

OCaml有可能吗?

1 个答案:

答案 0 :(得分:4)

Map.Make(String)是一个模块表达式,它返回一个模块,而不是一个类型。在这种情况下,由仿函数Map的应用程序生成的地图类型为'a Map.Make.(String).t。因此可以写

type 'a t = Dict of 'a Map.Make.(String).t 

此时还有其他两个重要的评论。首先,要使用此类型,在某些时候需要实际计算模块表达式以获取模块。这就是为什么,编写

更为惯用
module D = Map.Make(String)
type 'a t = Dict of 'a D.t
let empty = Dict D.empty

其次,只有一个类型和的构造函数表示这种类型的总和可能不是必需的。例如,类型sum可以在这里替换为类型别名:

module Dict = Map.Make(String)
type 'a t = 'a Dict.t