haskell中的模式匹配错误

时间:2016-01-16 17:48:31

标签: haskell pattern-matching primes

您好我一直在尝试回答一个问题,该问题涉及检查数字是否为素数。我想出了下面的代码:

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中运行时,对于大于2的任何值,它会返回错误“模式匹配失败:isitprime2 a a-1”。

然而,对于任何直接乘以2的值,它都会返回false,例如isitprime2 2 1返回false,isitprime2 4 2,isitprime2 6 3,isitprime2 10 5等都返回false。

出了什么问题,为什么?

谢谢:D

1 个答案:

答案 0 :(得分: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