diff --git a/library/PrimitiveExtras/Monad.hs b/library/PrimitiveExtras/Monad.hs
--- a/library/PrimitiveExtras/Monad.hs
+++ b/library/PrimitiveExtras/Monad.hs
@@ -13,3 +13,18 @@
   do
     indexCounts <- runFold (lmap fst (A.indexCounts outerArraySize))
     runFold (A.primMultiArray (indexCounts :: PrimArray Word32))
+
+{-| Please notice that this function is highly untested -}
+replicateMPrimArray :: (Monad m, Prim element) => Int -> m element -> m (PrimArray element)
+replicateMPrimArray size elementM =
+  do
+    !mutable <- return (unsafeDupablePerformIO (newPrimArray size))
+    let 
+      iterate index =
+        if index < size
+          then do
+            element <- elementM
+            let !() = unsafeDupablePerformIO (writePrimArray mutable index element)
+            iterate (succ index)
+          else return (unsafePerformIO (unsafeFreezePrimArray mutable))
+      in iterate 0
diff --git a/primitive-extras.cabal b/primitive-extras.cabal
--- a/primitive-extras.cabal
+++ b/primitive-extras.cabal
@@ -1,7 +1,7 @@
 name:
   primitive-extras
 version:
-  0.1.7.1
+  0.1.8
 category:
   Primitive
 synopsis:
