John Meacham john at
Thu May 27 20:11:58 EDT 2004

Pretty simple, and quite useful. perhaps it could be added as
Control.FunctorM ? 

just as Functor generalises 'map', FunctorM generalises 'mapM'.

there are probably some instances I missed. note that unlike Functor, an
instance for IO cannot be written for FunctorM. 

module FunctorM where

import Array

class FunctorM f where
    fmapM :: Monad m => (a -> m b) -> f a -> m (f b)

instance FunctorM [] where
    fmapM f xs = mapM f xs

instance FunctorM Maybe where
    fmapM _ Nothing = return Nothing
    fmapM f (Just x) = f x >>= return . Just 

instance Ix i => FunctorM (Array i) where
    fmapM f a = sequence [ f e >>= return . (,) i | (i,e) <- assocs a] >>= return . array b  where
        b = bounds a

John Meacham - ⑆⑆john⑈ 

More information about the Libraries mailing list