我正在对这个 Haskell 函数执行奇数检查,虽然它在处理负数时确实适用于正数,但它返回一个错误。
myodd :: Integer -> Bool
myodd = rem n 2 == 1
我认为如果我将腹肌放在某个地方会起作用..像这样:
myodd :: Integer -> Bool
myodd = rem (abs(n)) 2 == 1
但是在放置负数时我仍然收到错误..
我不知道我还能做什么......任何想法都会非常感激:)
我正在对这个 Haskell 函数执行奇数检查,虽然它在处理负数时确实适用于正数,但它返回一个错误。
myodd :: Integer -> Bool
myodd = rem n 2 == 1
我认为如果我将腹肌放在某个地方会起作用..像这样:
myodd :: Integer -> Bool
myodd = rem (abs(n)) 2 == 1
但是在放置负数时我仍然收到错误..
我不知道我还能做什么......任何想法都会非常感激:)
您可以检查结果是否不等于 0(而不是等于 1)。
myodd :: Integer -> Bool
myodd n = n `rem` 2 /= 0
rem 函数不会改变结果的符号,所以如果你从一个负数开始,你会得到一个负数。如果您只想获得正数,请使用 mod 函数,该函数计算数学上正确的模数:
>>> (-3) `rem` 4
-3
>>> (-3) `mod` 4
1
如所写,您的代码将无法编译。myodd :: rem (abs(n)) 2 == 1
is 不是合法的语法(也不是myodd :: rem n 2 == 1
),因为::
后面应该跟一个类型,而不是一个表达式(无论如何,你已经在前一行给出了一个类型签名)。要定义myodd
你应该使用=
并且你应该给它一个名为的参数n
,因为你n
在正文中使用:
myodd :: Integer -> Bool
myodd n = rem (abs(n)) 2 == 1
现在,此代码可以完全按照您想要的方式编译和工作。如果您使用负数调用它,则不会发生运行时错误。