STMonadTrans 0.4 → 0.4.1
raw patch · 4 files changed
+63/−40 lines, 4 filesdep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base
API changes (from Hackage documentation)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) (GHC.Ptr.FunPtr a) (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) (GHC.Ptr.Ptr a) (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) (GHC.Stable.StablePtr a) (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int16 (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int32 (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int64 (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int8 (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Bool (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Char (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Double (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Float (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Int (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Word (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word16 (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word32 (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word64 (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word8 (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans.Internal: instance GHC.Base.Monad m => Data.Array.Base.MArray (GHC.Arr.STArray s) e (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) (GHC.Ptr.FunPtr a) (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) (GHC.Ptr.Ptr a) (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) (GHC.Stable.StablePtr a) (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int16 (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int32 (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int64 (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Int.Int8 (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Bool (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Char (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Double (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Float (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Int (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Types.Word (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word16 (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word32 (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word64 (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (Data.Array.Base.STUArray s) GHC.Word.Word8 (Control.Monad.ST.Trans.Internal.STT s m)
+ Control.Monad.ST.Trans.Internal: instance (GHC.Base.Applicative m, GHC.Base.Monad m) => Data.Array.Base.MArray (GHC.Arr.STArray s) e (Control.Monad.ST.Trans.Internal.STT s m)
- Control.Monad.ST.Trans: freezeSTArray :: (Ix i, Monad m) => STArray s i e -> STT s m (Array i e)
+ Control.Monad.ST.Trans: freezeSTArray :: (Ix i, Applicative m, Monad m) => STArray s i e -> STT s m (Array i e)
- Control.Monad.ST.Trans: newSTArray :: (Ix i, Monad m) => (i, i) -> e -> STT s m (STArray s i e)
+ Control.Monad.ST.Trans: newSTArray :: (Ix i, Applicative m, Monad m) => (i, i) -> e -> STT s m (STArray s i e)
- Control.Monad.ST.Trans: newSTRef :: Monad m => a -> STT s m (STRef s a)
+ Control.Monad.ST.Trans: newSTRef :: (Applicative m, Monad m) => a -> STT s m (STRef s a)
- Control.Monad.ST.Trans: readSTArray :: (Ix i, Monad m) => STArray s i e -> i -> STT s m e
+ Control.Monad.ST.Trans: readSTArray :: (Ix i, Applicative m, Monad m) => STArray s i e -> i -> STT s m e
- Control.Monad.ST.Trans: readSTRef :: Monad m => STRef s a -> STT s m a
+ Control.Monad.ST.Trans: readSTRef :: (Applicative m, Monad m) => STRef s a -> STT s m a
- Control.Monad.ST.Trans: runSTArray :: (Ix i, Monad m) => (forall s. STT s m (STArray s i e)) -> m (Array i e)
+ Control.Monad.ST.Trans: runSTArray :: (Ix i, Applicative m, Monad m) => (forall s. STT s m (STArray s i e)) -> m (Array i e)
- Control.Monad.ST.Trans: thawSTArray :: (Ix i, Monad m) => Array i e -> STT s m (STArray s i e)
+ Control.Monad.ST.Trans: thawSTArray :: (Ix i, Applicative m, Monad m) => Array i e -> STT s m (STArray s i e)
- Control.Monad.ST.Trans: writeSTArray :: (Ix i, Monad m) => STArray s i e -> i -> e -> STT s m ()
+ Control.Monad.ST.Trans: writeSTArray :: (Ix i, Applicative m, Monad m) => STArray s i e -> i -> e -> STT s m ()
- Control.Monad.ST.Trans: writeSTRef :: Monad m => STRef s a -> a -> STT s m ()
+ Control.Monad.ST.Trans: writeSTRef :: (Applicative m, Monad m) => STRef s a -> a -> STT s m ()
Files
- Control/Monad/ST/Trans.hs +27/−17
- Control/Monad/ST/Trans/Internal.hs +18/−18
- STMonadTrans.cabal +8/−5
- changelog.md +10/−0
Control/Monad/ST/Trans.hs view
@@ -14,10 +14,10 @@ Warning! This monad transformer should not be used with monads that can contain multiple answers, like the list monad. The reason is that - the will be duplicated across the different answers and this cause- Bad Things to happen (such as loss of referential transparency). Safe - monads include the monads State, Reader, Writer, Maybe and - combinations of their corresponding monad transformers.+ the state token will be duplicated across the different answers and+ this causes Bad Things to happen (such as loss of referential+ transparency). Safe monads include the monads State, Reader, Writer,+ Maybe and combinations of their corresponding monad transformers. -} module Control.Monad.ST.Trans(@@ -60,6 +60,7 @@ import Data.Array.ST hiding (runSTArray) import qualified Data.Array.ST as STArray +import Control.Applicative import Control.Monad.ST.Trans.Internal import Data.IORef@@ -74,15 +75,15 @@ -- | Create a new reference-newSTRef :: Monad m => a -> STT s m (STRef s a)+newSTRef :: (Applicative m, Monad m) => a -> STT s m (STRef s a) newSTRef init = liftST (STRef.newSTRef init) -- | Reads the value of a reference-readSTRef :: Monad m => STRef s a -> STT s m a+readSTRef :: (Applicative m, Monad m) => STRef s a -> STT s m a readSTRef ref = liftST (STRef.readSTRef ref) -- | Modifies the value of a reference-writeSTRef :: Monad m => STRef s a -> a -> STT s m ()+writeSTRef :: (Applicative m, Monad m) => STRef s a -> a -> STT s m () writeSTRef ref a = liftST (STRef.writeSTRef ref a) {-# NOINLINE runST #-}@@ -103,7 +104,8 @@ -- Mutable arrays. -- | Creates a new mutable array-newSTArray :: (Ix i, Monad m) => (i,i) -> e -> STT s m (STArray s i e)+newSTArray :: (Ix i, Applicative m, Monad m) =>+ (i,i) -> e -> STT s m (STArray s i e) newSTArray bounds init = liftST (newArray bounds init) -- | Returns the lowest and highest indices of the array@@ -115,37 +117,45 @@ numElementsSTArray = STArray.numElementsSTArray -- | Retrieves an element from the array-readSTArray :: (Ix i, Monad m) => STArray s i e -> i -> STT s m e+readSTArray :: (Ix i, Applicative m, Monad m) =>+ STArray s i e -> i -> STT s m e readSTArray arr i = liftST (readArray arr i) -unsafeReadSTArray :: (Ix i, Monad m) => STArray s i e -> Int -> STT s m e+unsafeReadSTArray :: (Ix i, Applicative m, Monad m) =>+ STArray s i e -> Int -> STT s m e unsafeReadSTArray arr i = liftST (STArray.unsafeReadSTArray arr i) -- | Modifies an element in the array-writeSTArray :: (Ix i, Monad m) => STArray s i e -> i -> e -> STT s m ()+writeSTArray :: (Ix i, Applicative m, Monad m) =>+ STArray s i e -> i -> e -> STT s m () writeSTArray arr i e = liftST (writeArray arr i e) -unsafeWriteSTArray :: (Ix i, Monad m) => STArray s i e -> Int -> e -> STT s m ()+unsafeWriteSTArray :: (Ix i, Applicative m, Monad m) =>+ STArray s i e -> Int -> e -> STT s m () unsafeWriteSTArray arr i e = liftST (STArray.unsafeWriteSTArray arr i e) -- | Copy a mutable array and turn it into an immutable array-freezeSTArray :: (Ix i,Monad m) => STArray s i e -> STT s m (Array i e)+freezeSTArray :: (Ix i, Applicative m, Monad m) =>+ STArray s i e -> STT s m (Array i e) freezeSTArray arr = liftST (STArray.freezeSTArray arr) -unsafeFreezeSTArray :: (Ix i, Monad m) => STArray s i e -> STT s m (Array i e)+unsafeFreezeSTArray :: (Ix i, Applicative m, Monad m) =>+ STArray s i e -> STT s m (Array i e) unsafeFreezeSTArray arr = liftST (STArray.unsafeFreezeSTArray arr) -- | Copy an immutable array and turn it into a mutable array-thawSTArray :: (Ix i, Monad m) => Array i e -> STT s m (STArray s i e)+thawSTArray :: (Ix i, Applicative m, Monad m) =>+ Array i e -> STT s m (STArray s i e) thawSTArray arr = liftST (STArray.thawSTArray arr) -unsafeThawSTArray :: (Ix i, Monad m) => Array i e -> STT s m (STArray s i e)+unsafeThawSTArray :: (Ix i, Applicative m, Monad m) =>+ Array i e -> STT s m (STArray s i e) unsafeThawSTArray arr = liftST (STArray.unsafeThawSTArray arr) -- | A safe way to create and work with a mutable array before returning an -- immutable array for later perusal. This function avoids copying -- the array before returning it.-runSTArray :: (Ix i, Monad m)+runSTArray :: (Ix i, Applicative m, Monad m) => (forall s . STT s m (STArray s i e)) -> m (Array i e) runSTArray st = runST (st >>= unsafeFreezeSTArray)
Control/Monad/ST/Trans/Internal.hs view
@@ -121,7 +121,7 @@ -- MArray instances -instance Monad m => MArray (STArray s) e (STT s m) where+instance (Applicative m, Monad m) => MArray (STArray s) e (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -133,7 +133,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Bool (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Bool (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -145,7 +145,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Char (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Char (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -157,7 +157,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Int (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Int (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -169,7 +169,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Word (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Word (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -181,7 +181,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) (Ptr a) (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) (Ptr a) (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -193,7 +193,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) (FunPtr a) (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) (FunPtr a) (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -205,7 +205,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Float (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Float (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -217,7 +217,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Double (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Double (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -229,7 +229,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) (StablePtr a) (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) (StablePtr a) (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -241,7 +241,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Int8 (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Int8 (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -253,7 +253,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Int16 (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Int16 (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -265,7 +265,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Int32 (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Int32 (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -277,7 +277,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Int64 (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Int64 (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -289,7 +289,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Word8 (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Word8 (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -301,7 +301,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Word16 (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Word16 (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -313,7 +313,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Word32 (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Word32 (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}@@ -325,7 +325,7 @@ {-# INLINE unsafeWrite #-} unsafeWrite arr i e = liftST (unsafeWrite arr i e) -instance Monad m => MArray (STUArray s) Word64 (STT s m) where+instance (Applicative m, Monad m) => MArray (STUArray s) Word64 (STT s m) where {-# INLINE getBounds #-} getBounds arr = liftST (getBounds arr) {-# INLINE getNumElements #-}
STMonadTrans.cabal view
@@ -1,5 +1,5 @@ name: STMonadTrans-version: 0.4+version: 0.4.1 cabal-version: >= 1.8 license: BSD3 license-file: LICENSE@@ -13,10 +13,13 @@ Warning! This monad transformer should not be used with monads that can contain multiple answers, like the list monad. The reason is that - the state token will be duplicated across the different answers and this causes- Bad Things to happen (such as loss of referential transparency). Safe - monads include the monads State, Reader, Writer, Maybe and - combinations of their corresponding monad transformers.+ the state token will be duplicated across the different answers and+ this causes Bad Things to happen (such as loss of referential+ transparency). Safe monads include the monads State, Reader, Writer,+ Maybe and combinations of their corresponding monad transformers.++extra-source-files:+ changelog.md source-repository head type: git
+ changelog.md view
@@ -0,0 +1,10 @@+0.4.1++ * Add Applicative constraints to be compatible with GHC 7.8.4+ * Add changelog++0.4++ * New library structure, based on liftST. It reuses more code and+ types from the standard ST monad. Thanks to @wyager for liftST.+ * Instances for MArray