Haskell - Создание списка на основе условий, возвращаемых функциями - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть функция, которая выясняет, является ли определенное значение совершенным числом (суммирует все его факторы, кроме себя, производит себя) и возвращает логическое значение на основе его результата:

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

IТеперь есть функция, которая пытается использовать результат этой функции в качестве условия, которое, если оно истинно, приводит к тому, что значение помещается в список, а если нет, оно игнорирует это значение.С тех пор, как я начал использовать Haskell 2 дня назад, я очень борюсь с этим (я больше привык к Python).Это моя первая попытка сделать что-то правдоподобное:

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

Я пробовал много разных поисков в Google, чтобы посмотреть, можно ли создать этот список, используя понимание списка, что-то вроде

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

Но эта реализация не сработала.Поскольку я действительно хочу изучать Haskell, может ли кто-нибудь помочь мне (желательно используя только команды, доступные в prelude), чтобы заставить эту условную проверку работать?

1 Ответ

0 голосов
/ 26 сентября 2018

Присмотритесь к своему определению

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]

Да, это работает.[] == там лишнее.

...