3
據我所知,在SML模塊中,爲防止每個類型被不透明簽名歸屬隱藏,可以在簽名中指定具體類型。標準ML:製作一個帶有不透明簽名歸屬的透明類型
我試圖做一個仿函數來做符號表,隱藏表類型但是讓條目類型透明。但是每當我做不透明歸屬時,我都無法訪問入口類型。下面是我的簽名和函子:
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,並得到相同的錯誤。爲什麼這不像我認爲的那樣工作?有沒有辦法讓輸入類型透明?
這偉大的工作,我只是需要刪除括號避免語法錯誤。根據你的建議,我從'SYMTABLE'中刪除了子結構;我只是添加它來試圖解決問題中的問題。 –