2016-02-27 67 views
1

我必須實現設置聯合,差異和交集。然而,當插入與元組極其嵌套的集合時,它給了我錯誤的答案。我已經包含了函數的代碼片段。我可以做什麼來改善我的輸出?SML設置差異

val x17 = {1, 2, 8}; 
val x18 = {{1, 2, 8}, (1, {1, 2, 8})}; 
val x19 = ({{1, 2, 8}, (1, {1, 2, 8})}, {1, 2, 8}); 

例如操作:

x20 = {x19} Union x18; 
x21 = x20 \ {x17}; 
x22 = x20 intersection {x17}; 

正確答案:

x20 ={{1, 2, 8}, (1, {1, 2, 8}), ({{1, 2, 8}, (1, {1, 2, 8})}, {1, 2, 8})}; 
x21 ={(1, {1, 2, 8}), ({{1, 2, 8}, (1, {1, 2, 8})}, {1, 2, 8})}; 
x22 ={{1, 2, 8}}; 

我的輸出:

let x20 be {{1,2,8},(1,{1,2,8})}; 
let x21 be {(1,{1,2,8})}; 
let x22 be {{1,2,8}}; 

代碼

datatype expression = SET of expression list | INT of int 
    fun interFunc (SET [],SET b,interSet) = SET (rev interSet) 
     | interFunc (SET a,SET [],interSet) = SET (rev interSet) 
     | interFunc (SET (h1::t1),SET b,interSet) = if (List.exists (fn x=>x=h1) b) then interFunc(SET t1,SET b,h1::interSet) else interFunc(SET t1,SET b,interSet); 

     fun garbage [] = [] 
     | garbage (h::t) = if (List.exists (fn x=>x=h) t) then h::(garbage t) else (garbage t); 

     fun unionFunc (SET [],SET b) = SET (b) 
     | unionFunc (SET a,SET []) = SET (a) 
     | unionFunc (SET a,SET b) = SET (garbage [email protected]); 


     (* set operation: difference, modified interFunc *) 
     fun diffFunc (SET [],SET b,diffSet) = SET (rev diffSet) 
     | diffFunc (a,SET [],diffSet) = SET (rev diffSet) 
     | diffFunc (SET (h1::t1),SET b,diffSet) = if (List.exists (fn x=>x=h1) b) then diffFunc(SET t1,SET b,diffSet) else diffFunc(SET t1,SET b,h1::diffSet); 

回答

2

隨口說說,我看到了幾個錯誤:


garbage (h::t) = if (List.exists (fn x=>x=h) t) then h::(garbage t) else (garbage t) 

看起來garbage旨在通過選擇每個值最後一次出現刪除重複;例如,給出[1,2,3,2,1,2],它應該返回[3,1,2]。然而,它實際上做的是放棄每個值的最後一次出現,所以它會給[1,2,2]代替。


diffFunc (SET (h1::t1),SET b,diffSet) = if (List.exists (fn x=>x=h1) b) then diffFunc(SET t1,SET b,diffSet) else diffFunc(SET t1,SET b,h1::diffSet); 

如果發生在bh1,那麼你就需要做一些事來篩選出的b。上面沒有這樣做,所以實質上它產生了聯合而不是對稱的差異。總體而言,我建議您閱讀Eric Lippert的博文"How to debug small programs",以獲取有關調試程序的一般建議。