Можно ли создать больше чем один элемент списка за один раз с пониманием списка в haskell?

попробуйте запустить chrome.exe --allow-file-access-from-files

, запустив указанную выше командную строку, она включит вызов http с помощью:

[110 ]

обратите внимание, что данные возвращают строку. если вы добавите его в свой HTML, он покажет каталог

6
задан Paul Wicks 20 February 2009 в 00:19
поделиться

3 ответа

Вы могли использовать concat.

concat [ [(n*2),(n*3)] | n <- [1..5]] 
output: [2,3,4,6,6,9,8,12,10,15]
13
ответ дан 8 December 2019 в 02:35
поделиться

Я нахожу, что расширение понимания списка делает это легче читать:

[ m | n <- [1..5], m <- [2*n,3*n] ]

Могло бы быть полезно исследовать точно, что это делает, и как это касается других решений. Давайте определим его как функцию:

mult lst = [ m | n <- lst, m <- [2*n,3*n] ]

Некоторым образом, этот desugars к

mult' lst = 
    concatMap (\n -> concatMap (\m -> [m]) [2*n,3*n]) lst

Выражение concatMap (\m -> [m]) переносится m в списке для непосредственного выравнивания его — это эквивалентно map id.

Сравните это с ответом @FunctorSalad:

mult1 lst = concatMap (\n -> [n*2,n*3]) lst

Мы оптимизировали далеко concatMap (\m -> [m]).

Теперь ответ @vili:

mult2 lst = concat [ [(n*2),(n*3)] | n <- lst]

Этот desugars к:

mult2' lst = concat (concatMap (\n -> [[2*n,3*n]]) lst)

Как в первом решении выше, мы излишне создаем список списков, к которым мы имеем concat далеко.

Я не думаю, что существует решение, которое использует понимания списка, но desugars к mult1. Моя интуиция - то, что компиляторы Haskell достаточно обычно умны, что это не имело бы значения (или, альтернативно, настолько ненужный concats являются дешевыми из-за отложенных вычислений (тогда как они смертельны на нетерпеливых языках)).

17
ответ дан 8 December 2019 в 02:35
поделиться

В некоторых подобных случаях concatMap может также быть удобным, хотя здесь он не изменяется очень:

concatMap (\n -> [n*2,n*3]) [1..5]
5
ответ дан 8 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: