I often find myself wanting to insert regular functions into a “binded” sequence. Like in this contrived example:
getLine >>= lift (map toUpper) >>= putStrLn
I need to define the lift function lift :: (a -> b) -> a -> m b to make this work. Problem is I don’t know of such a function, and Hoogle doesn’t seem to either. I find this odd since this makes totally sense to me.
Now, there are probably other ways to make this work, but I like the way point-free style code allows me to scan the line in one pass to figure out what is happening.
let lift f x = return (f x) in
getLine >>= lift (map toUpper) >>= putStrLn
My question boils down to this: am I missing something or how come there isn’t a function like lift. My experience in Haskell is still very limited, so I am assuming that most people solve this in a different way. Can someone explain to me the idiomatic way of solving this.
There are three idiomatic ways.
Don’t use bind; use the first hit on your Hoogle search instead:
There are a variety of alternative spellings of
liftM, such asfmapor(<$>).Inline the
liftfunction you defined:Use the monad laws to fuse the last two binds in option 2: