show . (*10) . read
is a "non-monadic" function - by which I mean, it does not do anything in the IO monad, as you can see from its type.
>>= return .
can be shortened to
`liftM`
But
`liftM`
should always be equivalent to
`fmap`
fmap
neither needs the monad typeclass nor the applicative typeclass, it merely needs the functor typeclass.
Now turning our attention to the applicative version, this:
(<*>) (pure ...
is equivalent to <$>
, which is just fmap
.
So in both cases we are "really" just working with a functor operation, inbetween reading and writing, and although you have combined the functions in a slightly different way (we'd need to apply one or more "laws" to translate the two versions into each other), the semantics are - or should be - identical. Certainly they are with the IO monad, anyway.