En lenguajes como Haskell o Python, las listas por comprensión permiten generar y transformar listas con una sintaxis muy compacta.
En Elm no existen listas por comprensión como sintaxis, pero sí podemos expresar lo mismo con funciones de orden superior como map, filter y concatMap.
En Haskell:
[x * 2 | x <- [1..5]]
-- Resultado: [2,4,6,8,10]
En Elm:
dobles : List Int
dobles =
[1,2,3,4,5]
|> List.map (\x -> x * 2)
Resultado: [2,4,6,8,10]
Con condición (filter)
En Haskell:
[x * 2 | x <- [1..5], x > 2]
-- Resultado: [6,8,10]
En Elm:
doblesMayoresQueDos : List Int
doblesMayoresQueDos =
[1,2,3,4,5]
|> List.filter (\x -> x > 2)
|> List.map (\x -> x * 2)
-- Resultado: [6,8,10]
Generando pares (concatMap)
En Haskell:
[(x,y) | x <- [1,2], y <- [3,4]]
-- Resultado: [(1,3),(1,4),(2,3),(2,4)]
En Elm:
pares : List (Int, Int)
pares =
[1,2]
|> List.concatMap (\x ->
[3,4] |> List.map (\y -> (x, y))
)
-- Resultado: [(1,3),(1,4),(2,3),(2,4)]
Aunque Elm no tiene listas por comprensión como sintaxis, podemos lograr la misma expresividad combinando funciones de orden superior:
- List.map → transformación.
- List.filter → condiciones.
- List.concatMap → anidación (equivalente a los múltiples generadores de Haskell).
De esta forma, Elm mantiene un estilo declarativo y expresivo, alineado con su filosofía de simplicidad y claridad.