功能编程:奇数检查

时间:2013-07-08 15:39:37

标签: haskell

我正在对这个Haskell函数执行奇数检查,虽然在负数时它确实与正数一起使用但它会返回错误..

myodd :: Integer -> Bool
myodd = rem n 2 == 1

我认为如果我将abs放在某个地方会起作用..就像这样:

myodd :: Integer -> Bool
myodd = rem (abs(n)) 2 == 1

但是在放置负数时我仍会收到错误..

我不知道我还能做什么......任何想法都会非常感激:)

3 个答案:

答案 0 :(得分:5)

您可以检查结果是否不等于0(相反,如果它等于1)。

myodd :: Integer -> Bool
myodd n = n `rem` 2 /= 0

答案 1 :(得分:4)

rem函数不会更改结果的符号,因此如果以负数开头,则会返回负数。如果您只想获得正数,请使用mod函数,该函数计算数学上正确的模数:

>>> (-3) `rem` 4
-3
>>> (-3) `mod` 4
1

答案 2 :(得分:3)

如上所述,您的代码将无法编译。 myodd :: rem (abs(n)) 2 == 1不是合法语法(也不是myodd :: rem n 2 == 1),因为::后面应该跟一个类型,而不是表达式(无论如何,你已经在前一行中给出了一个类型签名)。要定义myodd,您应该使用=,并且应该为其指定一个名为n的参数,因为您在正文中使用n

myodd :: Integer -> Bool
myodd n = rem (abs(n)) 2 == 1

现在,这段代码的编译和工作完全符合您的要求。如果使用负数调用它,则不会发生运行时错误。