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

  • 本文关键字:haskell 元素 求和 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

如果您正在寻找奇数,这:(n/2 > 1)可能是错误的。你可以试着用odd n代替它。碰巧odd是标准库中的一个函数!

您得到如此可怕的错误的原因是因为除法运算符(/)只能用于小数,而模函数(mod)只能用于整数。所以类型检查器会混淆你想要n是整型还是浮点型。

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

的结果
niepdodlist [3,6,3]

应该是6,而不是12!因为6是偶数,所以不能算在总和里。

对于错误,函数(/)定义为(/) :: 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 <- x,奇数x, x mod 3 == 0]

最新更新