encuentro que se amplía la lista de comprensión hace esto más fácil de leer:
[ m | n <- [1..5], m <- [2*n,3*n] ]
Puede ser útil examinar exactamente qué hace esto y cómo se relaciona con otras soluciones. Vamos a definir como una función:
mult lst = [ m | n <- lst, m <- [2*n,3*n] ]
Después de una moda, este desugars a
mult' lst =
concatMap (\n -> concatMap (\m -> [m]) [2*n,3*n]) lst
La expresión concatMap (\m -> [m])
está terminando m
en una lista con el fin de aplanar inmediatamente — es equivalente a map id
.
comparar esto con la respuesta de @ FunctorSalad:
mult1 lst = concatMap (\n -> [n*2,n*3]) lst
Hemos optimizado de distancia concatMap (\m -> [m])
.
Ahora @ respuesta de Vili:
mult2 lst = concat [ [(n*2),(n*3)] | n <- lst]
Este desugars a:
mult2' lst = concat (concatMap (\n -> [[2*n,3*n]]) lst)
Al igual que en la primera solución anterior, estamos creando innecesariamente una lista de listas que tenemos que concat
de distancia.
No creo que haya una solución que use listas de comprensión, pero desácidos a mult1
. Mi intuición es que los compiladores de Haskell son generalmente lo suficientemente inteligentes como para que esto no importara (o, alternativamente, que los concat
s innecesarios son baratos debido a la evaluación perezosa (mientras que son letales en los idiomas ansiosos)).
Para 'instancia Monad []', '(>> =) == voltear concatMap' ... parece que la respuesta de Chris pasó por alto esa parte, pero esta respuesta es un subconjunto de la anterior. – ephemient