2017-03-06 61 views
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,並得到相同的錯誤。爲什麼這不像我認爲的那樣工作?有沒有辦法讓輸入類型透明?

回答

3

您還需要指定生成的類型E.entry與functor參數相關。就在仿函數的聲明更改爲

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 ... 
+0

這偉大的工作,我只是需要刪除括號避免語法錯誤。根據你的建議,我從'SYMTABLE'中刪除了子結構;我只是添加它來試圖解決問題中的問題。 –