2017-03-06 8 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 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'から部分構造を削除しました。私はその質問の問題を解決するために追加しただけでした。 –

関連する問題