Создайте список в Haskell, используя понимания, фильтруя последовательности каждые два числа - PullRequest
3 голосов
/ 19 апреля 2019

Я хотел бы выполнить следующий список в haskell, используя понимания:

[1,2,5,6,9,10,13,14,17,18]

Я пробовал это:

[x | x <- [1..18], y <- [1..4], y < 3]

но я получаю это:

[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18]

Я не знаю, смогу ли я использовать какую-нибудь функцию Enum для получения списка, но мне интересно, есть ли какой-нибудь способ сделать это с помощью понимания списка. Я вижу, что я получаю один x для каждого значения y, но я хочу, чтобы значения y были только в фильтре, а не для первого поколения списка.

Ответы [ 4 ]

4 голосов
/ 19 апреля 2019

Вы можете захотеть это:

Prelude> [x+y | x <- [1, 5..18], y <- [0..1]]
[1,2,5,6,9,10,13,14,17,18]
3 голосов
/ 19 апреля 2019

Попробуйте это

[x | x <- [1..18], x rem 4 < 2]

РЕДАКТИРОВАТЬ

правильное решение

 [x + 1 | x <- [0..17], x `rem` 4 < 2]
1 голос
/ 19 апреля 2019

Игнорируя понимание списка, это просто

-- [1,2,5,6,9,10,13,14,17,18] == [1,2] ++ [5,6] ++ [9,10] ++ ...
--                            == [1+0,1+1] ++ [5+0,5+1] ++ [9+0,9+1] ++ ...
concatMap (\x -> [x, x+1]) [1,5..18]

или

[1,5..18] >>= \x -> [x, x+1]

Переводя обратно к пониманию списка, вы получаете @ NetWave's answer (через [1,5..18] >>= \x -> [0..1] >>= \y -> [x + y])

0 голосов
/ 19 апреля 2019

Это повторение добавления 1 и 3 к предыдущим значениям, так что, возможно, понимание списка не лучшее решение.У вас уже есть идеальные ответы.

Это также лениво, что обычно более полезно.

scanl (+) 1 $ cycle [1,3]

take 25 $ scanl (+) 1 $ cycle [1,3]

[1,2,5,6,9,10,13,14,17,18,21,22, 25,26,29,30,33,34,37,38,41,42,45,46,49]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...