Types 具有非基元数据类型构造函数的OCAML和类型

Types 具有非基元数据类型构造函数的OCAML和类型,types,constructor,sum,ocaml,Types,Constructor,Sum,Ocaml,我想创建一个充当字典的sum类型,以便 type dict = Dict of Map.Make(String) 在OCaml中可能吗?Map.MakeString是一个模块表达式,返回的是模块,而不是类型。在本例中,函子映射的应用程序生成的映射类型是“a map.Make.String.t”。因此,可以编写 type 'a t = Dict of 'a Map.Make.(String).t 在这一点上还有另外两个重要的评论。首先,要使用这种类型,需要在某个时刻实际计算模块表达式以获得模

我想创建一个充当字典的sum类型,以便

type dict = Dict of Map.Make(String)
在OCaml中可能吗?

Map.MakeString是一个模块表达式,返回的是模块,而不是类型。在本例中,函子映射的应用程序生成的映射类型是“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只有一个构造函数,这表明该类型sum可能不是必需的。例如,类型sum可以在此处替换为类型别名:

module Dict = Map.Make(String)
type 'a t = 'a Dict.t
MakeString是返回模块而不是类型的模块表达式。在本例中,函子映射的应用程序生成的映射类型是“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只有一个构造函数,这表明该类型sum可能不是必需的。例如,类型sum可以在此处替换为类型别名:

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

不清楚你在问什么。如果您需要一个字典,而不是。我想用字典构造函数创建一个求和类型。例如,类型t=Int of Int。类似地,我想要类似的东西,类型t=Dict of MapString?像这样的事情。不清楚你在问什么。如果您需要一个字典,而不是。我想用字典构造函数创建一个求和类型。例如,类型t=Int of Int。类似地,我想要类似的东西,类型t=Dict of MapString?类似这样。请注意,根据函子的不同,每次调用都可以返回一个唯一的模块。使用Map.Make.String.t类型“a t=Dict of”将无法创建此类型的实例,因为这需要再次调用函子,从而生成新的唯一模块。因此,始终使用module D=Map.MakeString来避免令人不快的意外。Ocaml函子非常实用,因此,同一个函子对同一个模块的两个不同应用程序将产生两个相等的模块:int-Map.MakeString.t模块D=Map.MakeString let x=A D.empty按预期工作。不总是相等:模块类型M=sig end let next=let x=ref 0 in function->incr x!x模块U M:M=struct let id=next end模块M=struct end模块A=UM模块B=UM;;A.id==B.id;;无法从内存中创建具有唯一类型的示例,但我确实遇到过这种情况。更准确地说,当一个函子对同一模块应用两次时,类型级别组件是相等的,而不是值级别。另一个重要的观点是,如果模块共享相同的路径,则它们被视为等同于函子输入。特别是,对于任何函子F,Fstruct…end≠ 因为struct…end是一个匿名模块。但是,是的,我同意通常首先定义模块M=FX是一个好主意。使用Map.Make.String.t类型“a t=Dict of”将无法创建此类型的实例,因为这需要再次调用函子,从而生成新的唯一模块。因此,始终使用module D=Map.MakeString来避免令人不快的意外。Ocaml函子非常实用,因此,同一个函子对同一个模块的两个不同应用程序将产生两个相等的模块:int-Map.MakeString.t模块D=Map.MakeString let x=A D.empty按预期工作。不总是相等:模块类型M=sig end let next=let x=ref 0 in function->incr x!x模块U M:M=struct let id=next end模块M=struct end模块A=UM模块B=UM;;A.id==B.id;;无法从内存中创建具有唯一类型的示例,但我确实遇到过这种情况。更准确地说,当一个函子对同一模块应用两次时,类型级别组件是相等的,而不是值级别。另一个重要的观点是,如果模块共享相同的路径,则它们被视为等同于函子输入。特别是,对于任何函子F,Fstruct…end≠ 因为struct…end是一个匿名模块。但是,是的,我同意通常首先定义模块M=FX是一个好主意。