2016-01-23 49 views
1

我得到了這兩個問題對於這個功能:SML:錯誤:匹配冗餘和警告:符合非排他性

fun funion([(x:int list,y:bool list)]) = 
let 
fun join(nil,final) = final | 
    join(x::xs,final) = join(xs,union(x,final)) | 
    join(_,final) = final 
in 
join([(x,y)],(nil,nil)) 
end; 

以下是錯誤:

sets.sml:30.6-32.27 Error: match redundant 

(nil,final) => ... 

(x :: xs,final) => ... 

--> (_,final) => ... 

sets.sml:28.5-35.4 Warning: match nonexhaustive 

(x,y) :: nil => ... 

有誰知道什麼可能是去這裏?我也嘗試加入(_),但那也不起作用。不知道這裏有什麼問題。

未捕獲的異常錯誤

編輯:

這裏是聯盟的定義:

fun union((w:int list,x:bool list),(y:int list,z:bool list)) = 
let 
fun join((nil,nil),final) = final | 
    join((w::ws,x::xs),(intfinal,boolfinal)) = if x andalso elementOf(w,(intfinal,boolfinal))=false then join((ws,xs),(w::intfinal,true::boolfinal)) else join((ws,xs),(intfinal,boolfinal)) | 
    join(_,final) = final 
in 
join((w,x),join((y,z),(nil:int list,nil:bool list))) 
end; 
+1

什麼是'union'?它既不是由您定義的,也不是標準基礎的一部分。另外 - 它是否真的打算定義一個函數('funion'),它只能應用於一個具有1個元素的列表?我沒有看到'funion([(x:int list,y:bool list)])'與'funion(x:int list,y:bool list)'相對的任何理由。 –

+0

我自己宣佈工會。它找到兩組整數的聯合。funion找到n個集合的聯合。所以我遞歸地調用當前集合上的連接以及之前所有集合的連接。 – user3685346

+1

如果它是你定義的一部分,你應該包括'union',並且更加清楚地解釋'funion'的輸入和輸出是什麼。 –

回答

2

據我瞭解,funion應該有類型

(int list * bool list) list -> (int list * bool list) 

但是 - 你只提供了長度爲1的列表的定義,它給出了一個詳盡的列表警告。

對於內部函數join,首先爲(nil, final)形式的圖案提供定義,然後爲(x::xs,final)形式的圖案提供定義。由於第一個組件或者是空的,或者匹配x::xs的模式以及任何與final匹配的列表,任何進一步的模式都是多餘的。也許你想要的三種模式

1)(nil,ys)

2)(xs,nil)

3)(xs,ys)

最後一點 - 如果你很高興與union - 爲什麼不只是使用它foldlfoldl如果你有一個(int list * bool list)的列表以及它們的組合是什麼?

+0

非常感謝您的幫助。至於我爲什麼不使用foldl,這是因爲這是我班的任務。 – user3685346

1

「錯誤:匹配冗餘」意味着模式不匹配以前測試過的匹配不匹配的任何內容。在你的情況下,你有匹配模式(nil, final)(它匹配其第一個元素是空列表的任何對)和匹配模式(x::xs, final)(匹配其第一個元素是非空列表的任何對),它們一起涵蓋所有案例。 。 。然後你有匹配模式(_, final),它不匹配任何新的東西。從技術上講,這不需要是一個錯誤—編譯器可以發出警告,並放棄這個匹配—,但這是一個嚴重的警告,SML/NJ將其視爲錯誤。

「警告:非排他性匹配」意味着您的匹配模式不涵蓋所有情況。在你的情況下,匹配模式([(x:int list,y:bool list)])只能匹配單個元素列表。 (您可能只是想寫(x:int list, y:bool list),沒有[...]表示法來匹配硬編碼長度列表。)