
On Sun, 01 Sep 2013 15:18:32 +0400, Erik de Castro Lopo
Err, mapM is defined as:
mapM :: Monad m => (a -> m b) -> [a] -> m [b]
Yeah, the signatures for mapM_ and mapM would respectively be mapM_ :: Monad m => (Word8 -> m b) -> ByteString -> m () mapM :: Monad m => (Word8 -> m Word8) -> ByteString -> m ByteString After all, the signature for ByteString-y `map` too requires a function of type `Word8 -> Word8`, so it seems perfectly reasonable for mapM to exist.
in that the second parameter is a list. ByteStrings are not lists, they're chunks of bytes. Besides, you can just do:
let bs = "This is a bytestring" mapM someFUnctions $ BS.unpack bs
or define a function:
mapBSM :: Monad m => (Char -> m a) -> ByteString -> m [a] mapBSM f bs = mapM f $ BS.unpack bs
and similar for mapBSM_.
There’s even a RULE which would optimise this. However, it still would be *four times slower* than necessary if the monad in question is IO or ST.