我正在尝试自学Haskell,并且正在做随机练习。 我应该写一个可以做到这一点的代码6 = [1 * 1 + 3 * 3 + 5 * 5] = 35 因此,如果我将每个单数与自身相乘,则必须过滤掉所有奇数,然后计算总和。
sumquad n = (potenzsum(filter odd (ones n)))
where
potenzsum [x] = x*x
potenzsum [x,y] = x*x + y*y
potenzsum (x:xs) = x + potenzsum xs
ones 0 = []
ones x = [ 1 .. x]
此代码有效;) 现在,我应该做同样的事情,但是要理解列表(我可以使用此列表[1 ... n]
我只能想到这个……有人可以帮我吗?
power1 xs = [x*x | x <- xs]
答案 0 :(得分:4)
实际上,您完成了[x * x | x <- xs]
的一半工作,只需将xs
替换为上例中的奇数即可:
[x * x | x <- filter odd (ones 6))]
您将收到一个正方形列表:[1, 9, 25]
,可以由函数sum求和:
f n = sum [x * x | x <- filter odd (ones n))]
其评估为35
关于列表理解的另一个注意事项:可以通过指定条件(称为保护)来滤除迭代元素。因此,上面的代码可以重构为:
f n = sum [x * x | x <- [1..n], odd x]