如何在列表生成器中求和?

时间:2016-03-16 18:17:25

标签: haskell

我再次需要你帮助Haskell。案例是我如何使用列表生成器来定义哪些数字是“完美数字”(ei:完美数字:6其除数= 3,2,1&lt; - 它们的总和也是6)。我已经弄清楚如何写出除数:[m | n < - [1..5],m < - [1..n / 2],mod n m == 0]。 但是我怎样才能将除数与每个数字相加,哪里可以说明只有当总和与原始数字相等时才能写出除数。我想知道我可以在oroginal one或类似的东西中使用第二个列表生成器,但我不知道它在Haskell中是如何工作的以及它的syntaxt是什么。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我建议你先尝试解决原子问题,即一个数字是否完美。然后你可以尝试一个数字列表。假设你有一个正确的除数函数,你可以写

perfect :: Int -> Bool
perfect n = n == sum (divisors n)

一旦配备此功能,您可以将其映射到任何范围,例如

map perfect [1..100]

应该为6和28返回True。

你的除数函数可以写成

divisors :: Int -> [Int]
divisors k = [m | m <- [1 .. div k 2], mod k m == 0]