Monadic version of functions for containers (adjustM, updateWithKeyM, etc)

Thomas DuBuisson thomas.dubuisson at
Mon Sep 27 18:47:19 EDT 2010

On Mon, Sep 27, 2010 at 3:16 PM, Felipe Lessa <felipe.lessa at> wrote:
>>    adjustM f k m == liftM (\x -> insert k x m) (f $ lookup k m )
> This suggests that you don't need the Monad constraint, only Functor.

That's just because I hid the case where `lookup k m` fails.  I'm sure
looking at other desirable *M functions would reveal similar issues
with using Functor alone.

    adjustM f k m ==
        case lookup k m of
              Just x -> liftM (\new -> insert k new m) (f x)
              Nothing -> return m

translating this to Functor:

    adjustF f k m ==
        case lookup k m of
            Just x -> fmap (\new -> insert k new m) (f x)
            Nothing -> ???  -- perhaps "pure m" thus adding another
constraint, but how would that be better than Monad for most people?


More information about the Libraries mailing list