我有一个函数可以确定某个值是否为“完美数”(除自身以外的所有因素之和,都会产生自身)并根据结果返回布尔值:
isPerfect :: Int -> Bool
isPerfect n = n == sum [i | i <- [1..n-1], n mod i == 0]
我现在有一个函数,尝试使用该函数的结果作为条件,如果为true,则会将值放入列表中;否则,它将忽略该值。自从两天前开始使用Haskell以来,我为此做了大量工作(我更习惯于Python)。这是我第一次尝试看似可行的事情:
isPerfectUpToN :: Int -> [Int]
isPerfectUpToN n = [] insert y
where
y = [1..n] AND isPerfect y == True
我尝试了许多不同的Google搜索,以查看是否可以使用列表理解来创建此列表,类似
[] == [y | y <- [1..n], isPerfect y]
但是此实现无效。由于我确实想学习Haskell,有人可以帮助我(最好仅使用序言中提供的命令)使此条件检查生效吗?
答案 0 :(得分:1)
仔细看看您的定义
isPerfect n = n == sum [i | i <- [1..n-1], n `mod` i == 0] -- NB the `mod`
它已经保留了i
个通过测试的数字n `mod` i == 0
,并丢弃了所有其他数字。
因此,您只是利用相同的原理:
perfectsTo :: Int -> [Int]
perfectsTo n = [i | i <- [1..n], isPerfect i]
是的,它确实有效。 [] ==
是多余的。