Я недавно написал код со следующим шаблоном и задавался вопросом, существует ли более короткий способ его записи.
foo :: IO String
foo = do
x <- getLine
putStrLn x >> return x
Чтобы сделать вещи немного чище, я написал эту функцию (хотя я не уверен, что это подходящее имя):
constM :: (Monad m) => (a -> m b) -> a -> m a
constM f a = f a >> return a
Затем я могу сделать foo следующим образом:
foo = getLine >>= constM putStrLn
Существует ли уже существующая функция/идиома? А если нет, то какое лучшее имя для моего constM?