Последовательность связывания с чистыми функциями

Мне часто хочется вставить обычные функции в "связанную" последовательность. Как в этом надуманном примере:

getLine >>= lift (map toUpper) >>= putStrLn

Мне нужно определить функцию подъема lift :: (a -> b) -> a -> m b, чтобы все заработало. Проблема в том, что я не знаю о такой функции, и Hoogle, похоже, тоже. Я нахожу это странным, так как это имеет для меня смысл.

Вероятно, есть и другие способы заставить это работать, но мне нравится, как бесточечный код позволяет мне сканировать строку за один проход, чтобы понять, что происходит.

let lift f x = return (f x) in
getLine >>= lift (map toUpper) >>= putStrLn

Мой вопрос сводится к следующему: я что-то упускаю или почему нет такой функции, как подъемная сила. Мой опыт работы с Haskell все еще очень ограничен, поэтому я предполагаю, что большинство людей решают эту проблему по-другому. Может кто-нибудь объяснить мне идиоматический способ решения этой проблемы.

8
задан Magnus Kronqvist 15 March 2012 в 12:41
поделиться