Comprensiones de listas en Haskell
Los generadores a la derecha de la barra alimentan la expresión de la izquierda; las guardas descartan lo que falla.
module Comprehensions where
-- a generator on the left of the bar, a guard on the right to filter
ripeWeights :: [Int]
ripeWeights = [w | w <- [4, 9, 12, 3, 15], w >= 9]
-- the head of the comprehension transforms each element it draws
toOunces :: [Int] -> [Int]
toOunces ws = [w `div` 28 | w <- ws]
-- two generators nest, and the rightmost one changes fastest
plotLabels :: [String]
plotLabels = [row : show bed | row <- "ABC", bed <- [1 .. 3 :: Int]]
-- the head can build pairs; the guard skips a plot paired with itself
neighborPairs :: [(Int, Int)]
neighborPairs = [(a, b) | a <- [1 .. 3], b <- [1 .. 3], a /= b]
Cómo funciona
ripeWeightstoma dew <- [4, 9, 12, 3, 15]y deja solo los elementos que pasan la guardaw >= 9.toOuncesusa su propio argumento como generador y divide cada elemento entre 28 a la izquierda de la barra.plotLabelscorre dos generadores a la vez, y enneighborPairsla guardaa /= bdescarta los pares iguales.
Palabras clave y builtins usados aquí
IntStringmodulewhere
El intento, en números
- Líneas
- 17
- Caracteres a escribir
- 622
- Tokens
- 125
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 107 segundos.
Paso 3 de 3 en Listas; paso 12 de 27 en Fundamentos del lenguaje.