Haskell-根据函数返回的条件创建列表

时间:2018-09-26 15:30:51

标签: list function haskell conditional-statements list-comprehension

我有一个函数可以确定某个值是否为“完美数”(除自身以外的所有因素之和,都会产生自身)并根据结果返回布尔值:

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,有人可以帮助我(最好仅使用序言中提供的命令)使此条件检查生效吗?

1 个答案:

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

是的,它确实有效。 [] ==是多余的。