标准 ML:使用不透明的签名归属使类型透明
Standard ML: making a type transparent with opaque signature ascription
据我了解,在SML模块中,为了防止每个类型都被不透明的签名归属所隐藏,您可以在签名中指定具体类型。
我正在尝试使用一个仿函数来制作符号 tables,隐藏 table 类型但使条目类型透明。但是每当我做不透明的归属时,我都无法访问条目类型。这是我的签名和仿函数:
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 和 Moscow ML 并得到相同的错误。为什么这不像我认为的那样工作?有没有办法让入口类型透明?
您还需要指定结果类型 E.entry
与仿函数参数相关。只需将仿函数的声明更改为
functor SymtableFn (Ent:ST_ENTRY) :> (SYMTABLE where type E.t = Ent.entry) = struct ...
事实上,我会从签名 SYMTABLE
中删除子结构 E
并将上面的更改为
functor SymtableFn (Ent:ST_ENTRY) :> (SYMTABLE where type symentry = Ent.entry) = struct ...
据我了解,在SML模块中,为了防止每个类型都被不透明的签名归属所隐藏,您可以在签名中指定具体类型。
我正在尝试使用一个仿函数来制作符号 tables,隐藏 table 类型但使条目类型透明。但是每当我做不透明的归属时,我都无法访问条目类型。这是我的签名和仿函数:
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 和 Moscow ML 并得到相同的错误。为什么这不像我认为的那样工作?有没有办法让入口类型透明?
您还需要指定结果类型 E.entry
与仿函数参数相关。只需将仿函数的声明更改为
functor SymtableFn (Ent:ST_ENTRY) :> (SYMTABLE where type E.t = Ent.entry) = struct ...
事实上,我会从签名 SYMTABLE
中删除子结构 E
并将上面的更改为
functor SymtableFn (Ent:ST_ENTRY) :> (SYMTABLE where type symentry = Ent.entry) = struct ...