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.Functor
Control.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.
Esa es la respuesta perfecta. ¡Gracias! – Trismegistos
No estoy seguro de que esto ayude a la legibilidad; Creo que tu original a veces puede ser mejor. –
@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. –