【问题标题】:Haskell - Creating a List based on conditions returned by functionsHaskell - 根据函数返回的条件创建列表
【发布时间】:2018-09-26 15:30:50
【问题描述】:

我有一个函数可以判断某个值是否是完美数(将除自身之外的所有因子相加,产生自身)并根据其结果返回布尔值:

isPerfect :: Int -> Bool
isPerfect n = n == sum [i | i <- [1..n-1], n mod i == 0]

我现在有一个函数,它试图将此函数的结果用作条件,如果为真,则将一个值放入列表中,如果不是,则忽略该值。自从我 2 天前开始使用 Haskell 以来,我一直在为此苦苦挣扎(我更习惯于 Python)。这是我第一次尝试看似合理的事情:

isPerfectUpToN :: Int -> [Int]
isPerfectUpToN n = [] insert y
where
y = [1..n] AND isPerfect y == True

我已经尝试了许多不同的谷歌搜索,看看是否可以使用列表理解来创建这个列表,类似于

[] == [y | y <- [1..n], isPerfect y]

但是这个实现不起作用。由于我确实想学习 Haskell,有人可以帮助我(最好只使用前奏中可用的命令)让这个条件检查起作用吗?

【问题讨论】:

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


    【解决方案1】:

    仔细看看你的定义

    isPerfect n = n == sum [i | i <- [1..n-1], n `mod` i == 0]   -- NB the `mod`
    

    它已经保留了这些通过测试的数字in `mod` i == 0,并丢弃了所有其他数字。

    所以你只是利用相同的原理:

    perfectsTo :: Int -> [Int]
    perfectsTo n = [i | i <- [1..n], isPerfect i]
    

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

    【讨论】:

    • @AJFarmar 我很欣赏编辑,阴影可能会让新手感到困惑。虽然有时我喜欢在这种情况下使用枚举:“对于从 1 到给定限制的每个 n,......”。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2021-07-21
    相关资源
    最近更新 更多