2012-01-25 9 views

Respuesta

14

Prueba esto: result <- fmap words getLine

fmap toma una función con un tipo como a -> b y lo convierte en f a -> f b para todo lo que es una instancia de Functor, que debe incluir todos los casos Monad.

Hay una función equivalente llamada liftM que es específica de Monad, por razones históricas turbias. Puede que necesite usar eso en su lugar en algunos casos, pero para las mónadas estándar como IO puede quedarse con fmap.

También puede importar o Data.FunctorControl.Applicative para obtener una versión de operador agradable fmap, por lo que se podría escribir words <$> getLine lugar, que a menudo se ve más bonita.

+0

Esa es la respuesta perfecta. ¡Gracias! – Trismegistos

+1

No estoy seguro de que esto ayude a la legibilidad; Creo que tu original a veces puede ser mejor. –

+1

@LouisWasserman: si un valor intermedio como "línea" aquí solo se usa una vez en una expresión simple, a menudo es más fácil hacer las cosas de esta manera. Nombrar un valor significa que se puede usar en cualquier parte de ese alcance, lo que crea una cosa más para seguir mientras se lee toda la definición. –

Cuestiones relacionadas