Hi,
isn't the correct type context for f the following?
f :: (Functor m, Monad m) => Int -> m a -> m (Seq a)
So your f really is a kind of specialization of g.
Could the reason for f performing better be list fusion? Anything happening inside Control.Monad.replicateM should be subject to it.
Cheers,
Thomas
Am 24.01.2013 15:31, schrieb Daniel Díaz Casanueva:
Hi Cafe,
I was coding this morning when I suddenly found something that surprised
me. It's been a short time since I am really caring about the
performance of my programs. Before, I was just caring about their
correctness. So I am trying different things and profiling to see
differences. One difference I have found surprising is that the function
f is MUCH faster and less space consuming than the function g:
import Control.Monad
import qualified Data.Sequence as Seq
type Seq = Seq.Seq
f :: Monad m => Int -> m a -> m (Seq a)
f n = fmap Seq.fromList . replicateM n
g :: Monad m => Int -> m a -> m (Seq a)
g = Seq.replicateM
Maybe is just in my test case, where the Int argument is big and the
monadic action short, but it looks to me that Data.Sequence.replicateM
can be faster than it is right now.
Regards,
Daniel Díaz.
--
E-mail sent by Daniel Díaz Casanueva
let f x = x in x
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe