So I found out that fmap, a Functor function can be expressed in terms of Monadic operator >>= and return function like this:
fmap' :: (Monad m) => (a -> b) -> m a -> m b
fmap' g x = x >>= (\y ->
return (g y))
So my first question is how can we implement return function based on fmap?
Also if we can implement return function based on fmap, can we reduce Haskell expressions in do blocks? Would that produce more elegant code?
For instance:
Just x -> do
y <- f x
return (a:y)