2012-09-07 18 views
5

Así que pienso en Lambdas como se demuestra en Aprende Eres una Haskell:Confundido sobre este uso de un lambda

(filter (\xs -> length xs > 15) (map chain [1..100])) 

La entrada para XS es ​​la lista generada a partir (map chain [1..100])) Eso es bastante fácil de leer.

Así que aquí es donde me confundo, mirando algún Código del mundo real (tm).

Aquí está una función de conduit

fmap f (ResourceT m) = ResourceT $ \r -> fmap f (m r) 

¿Dónde está la entrada para r viene?

Respuesta

12

r no tendrá un valor hasta que realmente se llame a la función \r -> fmap f (m r). En la definición de fmap, nunca se llama a la función; solo se almacena en un ResourceT. Luego se puede sacar del ResourceT y llamar. Entonces es cuando r obtendrá un valor.

6

El \r -> fmap f (m r) es una función que es un ejemplo de closure. Las variables f y m son parte del entorno donde se va a ejecutar la función. Además, dado que Haskell es un lenguaje funcional, las funciones se pueden transmitir sin ser evaluadas o evaluadas parcialmente, como en este caso.

+2

Si pudiera elegir dos respuestas, lo haría. Upvote en cualquier caso. –

Cuestiones relacionadas