我试图在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]