我正在对这个Haskell函数执行奇数检查,虽然在负数时它确实与正数一起使用但它会返回错误..
myodd :: Integer -> Bool
myodd = rem n 2 == 1
我认为如果我将abs放在某个地方会起作用..就像这样:
myodd :: Integer -> Bool
myodd = rem (abs(n)) 2 == 1
但是在放置负数时我仍会收到错误..
我不知道我还能做什么......任何想法都会非常感激:)
答案 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
现在,这段代码的编译和工作完全符合您的要求。如果使用负数调用它,则不会发生运行时错误。