2016-01-16 82 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