Недавно я писал код со следующим шаблоном несколько раз, и мне было интересно, есть ли более короткий способ Напиши это.
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?