2016-01-16 83 views
-1

您好,我一直在試圖回答一個問題,該問題涉及檢查數字是否是質數。我想出了下面這段代碼:haskell中的模式匹配錯誤

isitprime :: Int->Bool 
isitprime n 
    | n<=1 = False 
    | otherwise = isitprime2 n (n-1) 

isitprime2 :: Int->Int->Bool 
isitprime2 x y 
    | y > 1 && x `mod` y == 0 = False 
    | y == 1 && x `mod` y == 0 = True 

當winhugs運行,它會返回一個錯誤說「模式匹配失敗:isitprime2一個A-1」的任何值大於2

但是它返回對於任何直接乘以2的值,都是錯誤的,例如isitprime2 2 1返回false,isitprime2 4 2,isitprime2 6 3,isitprime2 10 5等全部返回false。

出了什麼問題,爲什麼?

感謝:d

回答

2

問題與功能isitprime2的是,它不處理的所有情況。像時會發生什麼:

  • y > 1 && x mod y != 0
  • y == 1 && x mod y != 0

處理其他情況下,你的代碼將正常工作。您還可以使用otherwise子句處理所有邊緣情況:

isitprime2 :: Int->Int->Bool 
isitprime2 x y 
    | y > 1 && x `mod` y == 0 = False 
    | y == 1 && x `mod` y == 0 = True 
    | otherwise = ??? -- handle all edge case 
+0

太棒了!謝謝!! :d – naturesenshi