Обработка значения монады перед присвоением - PullRequest
7 голосов
/ 25 января 2012

Можно ли сделать эти две строки одной строкой:

main = do line <- getLine 
    let result = words line

что я имею в виду, что-то вроде не монадического кода

result = words getLine

- по моему мнению - улучшит читабельность.

1 Ответ

14 голосов
/ 25 января 2012

Попробуйте это: result <- fmap words getLine

fmap берет функцию с типом типа a -> b и превращает ее в f a -> f b для всего, что является экземпляром Functor, который должен включать все Monad экземпляры.

Существует эквивалентная функция liftM, специфичная для Monad по темным историческим причинам. Возможно, вам придется использовать это вместо этого в некоторых случаях, но для стандартных монад, таких как IO, вы можете придерживаться fmap.

Вы также можете импортировать Data.Functor или Control.Applicative, чтобы получить красивую операторскую версию fmap, так что вместо этого вы могли бы написать words <$> getLine, что часто выглядит красивее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...