2013-11-24 93 views
1

我對上模運算工作的項目。 我在調用函數時遇到了模式匹配問題。 這裏是Modular類型的構造函數。 madd帶兩個類型Modular的實例,並且設想將它們添加回來的類型Modular。非詳盡的模式匹配

data Modular = Mod Integer Integer deriving Show 
instance (Eq Modular) where 
    (Mod a1 m1) == (Mod a2 m2) = m1==m2 && mod (a1-a2) m1 == 0 


-- Adds two modular numbers of the same modulus 
madd :: Modular -> Modular -> Modular 
madd (Mod a1 m1) (Mod a2 m2) | m1 == m2 = Mod (mod (a1+a2) m1) m1 

任何人都可以幫助我,爲什麼我會得到非詳盡的模式匹配? 錯誤是這樣的:

Warning: Pattern match(es) are non-exhaustive 
     In an equation for `madd': 
      Patterns not matched: (Mod _ _) (Mod _ _) 

順便說一句,我使用的Eclipse IDE中的Haskell插件。

+4

如果'm1/= m2'會出現什麼情況? – tom

+0

湯姆的職位,作爲一個答案,讓mehdix_可以關閉問題:-) – kaan

+0

@湯姆,你能解釋一下嗎?你在上面提到的情況會發生什麼? –

回答

1

這是一個警告,不是錯誤。編譯器不夠聰明,無法檢查警戒語句,以確保它們覆蓋所有可能的匹配,因此它會排除與詳盡模式檢查中的警衛模式匹配。如果你沒有模式可以與沒有警衛的所有可能的投入相匹配,你將不得不忍受它,or disable it

+3

這種情況並不完全正確。真的有一個案件失蹤。即,'m1/= m2'的情況。 –

2

快速修復,你可以隨時添加自己的錯誤報告:

madd (Mod a1 m1) (Mod a2 m2) | m1 == m2 = Mod (mod (a1+a2) m1) m1 
madd (Mod a1 m1) (Mod a2 m2) = 
        error ("You can not add a mod " ++ show m1 
          ++ " number with a " show m2 ++ " number.") 

這不僅擺脫了警告,但它也可以用來給你更多的信息,如果該情況調用。當然,如果它被觸發時,程序會崩潰(因爲它會沒有額外的情況下)......如果我想要一個錯誤傳達給最終用戶,我會把在不太惡劣的東西。

+3

或者只使用'|否則= ...'。 –

0

「模式匹配(es)are not-exhaustive「

madd :: Modular -> Modular -> Modular 
madd (Mod a1 m1) (Mod a2 m2) | m1 == m2 = Mod (mod (a1+a2) m1) m1 
          **| otherwise = ...** you have to write the answer to this case