您的主要问题似乎是您仍然认为势在必行(使用insert
)-也是()
值单位-您可能想改写[]
(空列表)-但xs
此处仍然完全未定义,因此您也必须解决此问题(而且我不知道如何诚实)。
完美数字
我想我可以在那里看到一个基本的想法,我认为解决这个问题的最好方法是进行完整的列表理解(因为你似乎很好地理解了它们) - 这是一个应该工作的版本:
listX n = [ x | x <- [1..n], sum [ y | y <- [1..x-1], x `mod` y == 0] == x]
如您所见,我对此进行了一些更改-首先我检查所有x
从1
到n
是否可以完美-我通过总结所有适当的除数并检查总和是否等于来做到这一点x
(这就是sum [...] == x
部分的工作) - 如果您不知道这是有效的,因为您可以在列表推导中添加警卫(sum [..] == x
过滤掉所有符合条件的值x
)。
更好的版本
为了使它更具可读性(并分离关注点),我建议这样写:
properDivisors :: Integer -> [Integer]
properDivisors n = [ d | d <- [1..n-1], n `mod` d == 0]
isPerfect :: Integer -> Bool
isPerfect n = sum (properDivisors n) == n
perfectNumbers :: [Integer]
perfectNumbers = filter isPerfect [1..]
perfectNumbersUpTo :: Integer -> [Integer]
perfectNumbersUpTo n = takeWhile (<= n) perfectNumbers