2016-05-01 2 views
2

Мне интересно, можно ли добавить несколько элементов в список в понимании списка.Можно добавить несколько элементов в список?

Например, если я хочу список, состоящий из чисел от 1 до 10, я могу написать:

[k | k <- [1..10]] 

Однако, есть также способ сделать это, всегда добавляя kиk+1 в тот же шаг, и просто возьмите только нечетные числа k? Следующий код неверен, но, возможно, объясняет лучше, что я пытаюсь сделать:

[k, k+1 | k <- [1, 3..10]] 

В настоящее время, ближе всего к этому (что я знаю) заключается в следующем:

foldl1 (++) [[k, k + 1] | k <- [1, 3..10]] 

ответ

6

Есть некоторые альтернативы, ни одна из которых не намного лучше, чем вы предлагаете.

concat [ [k, k+1] | k <- [1, 3 .. 10] ] 
join [ [k, k+1] | k <- [1, 3 .. 10] ] 
[ x | k <- [1, 3 .. 10], x <- [k,k+1] ] 
[1, 3 .. 10] >>= (\x -> [x, x + 1]) 
do x <- [1, 3 .. 10] ; [x, x+1] 

foldl1 (++) Обратите внимание, что, как и в вашем решении, прервет программу с ошибкой времени выполнения, если он находит пустые списки списков-оф-. Вышеуказанные альтернативы не имеют такой проблемы.

+0

Благодарим вас за ответ и предоставление альтернатив! – flawr

+2

Другой - '[1, 3 .. 10] >> = (\ x -> [x, x + 1])'. – Jubobs

+1

... или эквивалентно 'do'' x <- [1, 3 .. 10] '' [x, x + 1] '. – leftaroundabout

Смежные вопросы