Sml 标准ML:使用不透明的签名归属使类型透明

Sml 标准ML:使用不透明的签名归属使类型透明,sml,signature,functor,Sml,Signature,Functor,据我所知,在SML模块中,为了防止不透明签名归属隐藏每个类型,可以在签名中指定具体类型 我试图用一个用于生成符号表的函子来实现这一点,隐藏表类型,但保持条目类型透明。但每当我进行不透明的归属时,我就无法访问条目类型。这是我的签名和函子: signature ST_ENTRY = sig type entry val name : entry -> string end signature SYMTABLE = sig structure E: ST_ENTRY

据我所知,在SML模块中,为了防止不透明签名归属隐藏每个类型,可以在签名中指定具体类型

我试图用一个用于生成符号表的函子来实现这一点,隐藏表类型,但保持条目类型透明。但每当我进行不透明的归属时,我就无法访问条目类型。这是我的签名和函子:

signature ST_ENTRY = sig
    type entry
    val name : entry -> string
end

signature SYMTABLE = sig
    structure E: ST_ENTRY
    type symentry = E.entry  
    type symtable
    val empty: symtable
    val insert: symtable -> E.entry -> symtable
    val lookup: symtable -> string -> E.entry option
end

functor SymtableFn (Ent:ST_ENTRY) :> SYMTABLE = struct
  structure E = Ent
  type symentry = E.entry
  type symtable = E.entry list
  val empty: symtable = []
  fun fromList symlist = symlist
  fun insert (tab: symtable) e = e::tab
end
然后,当我创建一个entry结构并用它实例化functor时,如下所示:

structure Myentry : ST_ENTRY = struct
  type entry = {name: string, typ: string}
  fun name (e:entry) = #name e
end

structure Mytable = SymtableFn (Myentry)
val tab = Mytable.insert (Mytable.empty) {name="x", typ="str"}

我在最后一行得到了一个类型冲突,但是如果我关闭不透明属性,它可以正常工作。我尝试了SML/NJ和Moscow ML,得到了相同的错误。为什么它不能像我想的那样工作?有没有办法使条目类型透明?

您还需要指定结果类型
E.entry
与functor参数相关。只需将functor的声明更改为

functor SymtableFn (Ent:ST_ENTRY) :> (SYMTABLE where type E.t = Ent.entry) = struct ...
事实上,我会从signature
SYMTABLE
中删除子结构
E
,并将上面的内容更改为

functor SymtableFn (Ent:ST_ENTRY) :> (SYMTABLE where type symentry = Ent.entry) = struct ...

这非常有效,我只需要删除括号以避免语法错误。根据您的建议,我从
SYMTABLE
中移除了底座;我添加它只是为了解决问题中的问题。