попробуйте запустить chrome.exe --allow-file-access-from-files
, запустив указанную выше командную строку, она включит вызов http с помощью:
[110 ]
обратите внимание, что данные возвращают строку. если вы добавите его в свой HTML, он покажет каталог
Вы могли использовать concat.
concat [ [(n*2),(n*3)] | n <- [1..5]]
output: [2,3,4,6,6,9,8,12,10,15]
Я нахожу, что расширение понимания списка делает это легче читать:
[ 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 достаточно обычно умны, что это не имело бы значения (или, альтернативно, настолько ненужный concat
s являются дешевыми из-за отложенных вычислений (тогда как они смертельны на нетерпеливых языках)).
В некоторых подобных случаях concatMap может также быть удобным, хотя здесь он не изменяется очень:
concatMap (\n -> [n*2,n*3]) [1..5]