
24 Apr
2008
24 Apr
'08
5:25 p.m.
Hi Ben,
mapM2 :: Monad m => (a -> m b) -> [a] -> m [b] {-# INLINE mapM2 #-} mapM2 fn lst = mapM2accum fn lst [] where mapM2accum _ [] accum = return accum mapM2accum fn (x:xs) accum = do r <- fn x mapM2accum fn xs (r:accum)
Not that it should matter for performance any, but you really ought to reverse the result list too, or compute the accumulator in the right order. :-) mapM2 :: Monad m => (a -> m b) -> [a] -> m [b] {-# INLINE mapM2 #-} mapM2 fn lst = mapM2accum fn lst id where mapM2accum _ [] accum = return $ accum [] mapM2accum fn (x:xs) accum = do r <- fn x mapM2accum fn xs (accum . (r:)) Cheers, /Niklas