我正在尝试在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
答案 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]