From 709b255cf883617bf19b8935fb80ebc77543118c Mon Sep 17 00:00:00 2001 From: Harry Garrood Date: Wed, 29 Jul 2015 05:14:57 +0100 Subject: [PATCH 1/2] Add test for stack-safety of replicateM --- test/Test/Data/Array.purs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/Test/Data/Array.purs b/test/Test/Data/Array.purs index b3e271b6..4a934572 100644 --- a/test/Test/Data/Array.purs +++ b/test/Test/Data/Array.purs @@ -31,6 +31,10 @@ testArray = do assert $ replicateM 0 (Just 1) == Just [] assert $ replicateM (-1) (Just 1) == Just [] + log "replicateM should be stack safe" + let n = 50000 + assert $ replicateM n (Just unit) == Just (replicate n unit) + -- some -- many From a235b86407feebb13105e95829daa27df4018377 Mon Sep 17 00:00:00 2001 From: Harry Garrood Date: Wed, 29 Jul 2015 05:16:45 +0100 Subject: [PATCH 2/2] Make replicateM stack safe --- src/Data/Array.purs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Data/Array.purs b/src/Data/Array.purs index 4d7f0873..019ba0c0 100644 --- a/src/Data/Array.purs +++ b/src/Data/Array.purs @@ -115,10 +115,8 @@ foreign import replicate :: forall a. Int -> a -> Array a -- | Perform a monadic action `n` times collecting all of the results. replicateM :: forall m a. (Monad m) => Int -> m a -> m (Array a) -replicateM n m | n < 1 = return [] - | otherwise = do a <- m - as <- replicateM (n - 1) m - return (a : as) +replicateM n m | n < 1 = return [] + | otherwise = sequence $ replicate n m -- | Attempt a computation multiple times, requiring at least one success. -- |