2012-09-08 79 views
1

我在傳遞給函數的參數上使用模式匹配。該方法工作正常,「第一級」匹配這麼說,但任何試圖去深入給出了錯誤「標準輸入:282.5-291.77錯誤:匹配冗餘SML函數參數模式匹配

例如

fun nnf T = T 
    | nnf F = F 
    | nnf (LETTER(x)) = (LETTER(x)) 
    | nnf (NEG(x)) = (NEG(nnf x)) 
    | nnf (AND(x,y)) = (AND(nnf x, nnf y)) 
    | nnf (OR(x,y)) = (OR(nnf x, nnf y)) 
    | nnf (IMP(x,y)) = (OR(NEG(nnf x),(nnf y))) 
    | nnf (NEG(NEG(LETTER(x)))) = (LETTER(x)) 
    | nnf (NEG(AND(LETTER(x),LETTER(y)))) = (OR(NEG(LETTER(x)),NEG(LETTER(y)))) 
    | nnf (NEG(OR(LETTER(x),LETTER(y)))) = (AND(NEG(LETTER(x)),NEG(LETTER(y)))); 
val nnf = fn : prop -> prop 

錯誤我得到的是

stdIn:282.5-291.77 Error: match redundant 
      T => ... 
      F => ... 
      LETTER x => ... 
      NEG x => ... 
      AND (x,y) => ... 
      OR (x,y) => ... 
      IMP (x,y) => ... 
    --> NEG (NEG (LETTER x)) => ... 
    --> NEG (AND (LETTER x,LETTER y)) => ... 
    --> NEG (OR (LETTER x,LETTER y)) => ... 

所以SML是說,在函數定義中的最後3個條款是相同的,因爲它們都與開始「(NEG(...」儘管接踵而來的是不同的。

我該如何克服這一點?

回答

4

案件NEG(x)已涵蓋涉及最外層NEG的任何可能的案件,所以其他人永遠不會到達。根據您實際想要達到的目標,可以刪除該案例,也可以在更具體的案例之後將其移動(按順序嘗試案例)。

+0

謝謝!那就是訣竅。傻我:) – Ankit