2017-03-06 14 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와 Moscow 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에서 제거했습니다; 나는 그 문제의 문제를 풀기 위해 추가했다. –