Такая функция уже существует? (Или, как лучше назвать эту функцию?)

Недавно я писал код со следующим шаблоном несколько раз, и мне было интересно, есть ли более короткий способ Напиши это.

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?

13
задан Adam Wagner 22 September 2011 в 16:58
поделиться