typestar

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

  1. ripeWeights toma de w <- [4, 9, 12, 3, 15] y deja solo los elementos que pasan la guarda w >= 9.
  2. toOunces usa su propio argumento como generador y divide cada elemento entre 28 a la izquierda de la barra.
  3. plotLabels corre dos generadores a la vez, y en neighborPairs la guarda a /= b descarta los pares iguales.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 3 de 3 en Listas; paso 12 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →