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

时间:2017-03-06 15:46:08

标签: sml signature functor

据我了解,在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

然后,当我创建一个入口结构并用它实例化该仿函数时,如下所示:

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和莫斯科ML并得到了同样的错误。为什么这不像我认为的那样有效?有没有办法让条目类型透明?

1 个答案:

答案 0 :(得分:3)

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

即可
functor SymtableFn (Ent:ST_ENTRY) :> (SYMTABLE where type E.t = Ent.entry) = struct ...

事实上,我会从签名E中删除子结构SYMTABLE并将上述内容更改为

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