0

我正在对这个 Haskell 函数执行奇数检查,虽然它在处理负数时确实适用于正数,但它返回一个错误。

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

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

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

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

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

4

3 回答 3

5

您可以检查结果是否不等于 0(而不是等于 1)。

myodd :: Integer -> Bool
myodd n = n `rem` 2 /= 0
于 2013-07-08T18:11:56.340 回答
4

rem 函数不会改变结果的符号,所以如果你从一个负数开始,你会得到一个负数。如果您只想获得正数,请使用 mod 函数,该函数计算数学上正确的模数:

>>> (-3) `rem` 4
-3
>>> (-3) `mod` 4
1
于 2013-07-08T15:45:25.460 回答
3

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

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

现在,此代码可以完全按照您想要的方式编译和工作。如果您使用负数调用它,则不会发生运行时错误。

于 2013-07-08T15:46:47.367 回答