如何对haskell中的元素求和(奇数除以3)

时间:2014-05-07 21:17:37

标签: haskell

我正在尝试在haskell中编写函数,我希望该函数只用奇数求和并除以列表中的3个元素。

我的代码是:

nieplist n = (n/2 > 1) && mod n 3 == 0
niepdodlist xs = sum $ filter nieplist xs

我认为一切都应该有效,首先我要检查列表中的数字是否奇怪,之后我想检查它是否除以3.(数字模块3总是0)

当我试着写:

*Main>niepdodlist [1,2,3,6]

结果是

<interactive>:220:1:
No instance for (Integral a0) arising from a use of `niepdodlist'...


<interactive>:220:14:
No instance for (Num a0) arising from the literal `1'
The type variable `a0' is ambiguous...

结果应该是:

*Main>niepdodlist [3,6,3]
>9 

解决方案(感谢@kqr)

nieplist n = odd n && mod n 3 == 0
niepdodlist xs = sum $ filter nieplist xs

2 个答案:

答案 0 :(得分:3)

如果您正在寻找奇数整数,那么:(n/2 > 1)可能是错误的。您可能想尝试将其替换为odd n。恰好odd是标准库中的一个函数!

你得到如此可怕的错误的原因是因为除法运算符(/)只能用于小数,但模函数(mod)只能用于积分数字。因此类型检查器对于您是希望n是整数还是浮点数感到困惑。

但请记住,根据您对问题的描述,

的结果
niepdodlist [3,6,3]

应该是6,而不是12!由于6是偶数,因此不计入总和。

答案 1 :(得分:0)

对于错误,函数(/)定义为(/) :: Fractional a => a -> a -> a,函数mod定义为mod :: Integral a => a -> a -> a。如您所见,一个使用小数,另一个使用积分。一种解决方案是使用div或quot(你可以使用反引号进行中缀)。

  

5`div` 2 = 2

对于逻辑,要测试一个数字是否为奇数,你应该只测试n % 2 == 0(n/2 > 1)不能完成相同的结果(任何大于3的数字都会这样做!)。

此功能也是列表推导的一个很好的例子。

  

niepdodlist xs = sum [x | x&lt; -xs,odd x,x mod 3 == 0]