如何在Haskell中使用列表推导?

时间:2018-08-09 21:10:54

标签: haskell

我正在尝试自学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]

1 个答案:

答案 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]