typestar

Lambdas y secciones en Haskell

Una lambda es una función sin nombre; una sección es un operador con un operando ya puesto.

module Lambdas where

-- a lambda is a function with no name: backslash, argument, arrow, body
withSurcharge :: [Int] -> [Int]
withSurcharge = map (\cents -> cents + 75)

-- a section fixes one operand: (* 2) doubles whatever it is handed
peakFares :: [Int] -> [Int]
peakFares = map (* 2)
-- but (10 -) subtracts its argument from ten; (- 10) is a negative
transfersLeft :: [Int] -> [Int]
transfersLeft = map (10 -)

-- flip swaps the first two arguments, so 60 lands on the right of div
hoursFromMinutes :: Int -> Int
hoursFromMinutes = flip div 60

-- once a body branches, a named helper reads better than a lambda
zoneFare :: Int -> Int
zoneFare zones = if zones <= 1 then 250 else 250 + 125 * (zones - 1)

Cómo funciona

  1. map (\cents -> cents + 75) pasa una lambda: contrabarra, argumento, flecha, cuerpo.
  2. map (* 2) y map (10 -) son secciones, y (- 10) se leería como un número negativo y no como una resta.
  3. hoursFromMinutes = flip div 60 pone 60 a la derecha de div; zoneFare se ramifica y por eso lleva nombre propio.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
20
Caracteres a escribir
709
Tokens
94
Ritmo de tres estrellas
70 tpm

Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 81 segundos.

Escribe este fragmento

Paso 3 de 3 en Orden superior; paso 15 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →