monads-tf 0.2.1.0 → 0.3.0.0
raw patch · 11 files changed
+19/−384 lines, 11 filesdep ~transformersPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: transformers
API changes (from Hackage documentation)
- Control.Monad.Cont.Class: instance (Control.Monad.Trans.Error.Error e, Control.Monad.Cont.Class.MonadCont m) => Control.Monad.Cont.Class.MonadCont (Control.Monad.Trans.Error.ErrorT e m)
- Control.Monad.Cont.Class: instance Control.Monad.Cont.Class.MonadCont m => Control.Monad.Cont.Class.MonadCont (Control.Monad.Trans.List.ListT m)
- Control.Monad.Error: ErrorT :: m (Either e a) -> ErrorT e (m :: Type -> Type) a
- Control.Monad.Error: [runErrorT] :: ErrorT e (m :: Type -> Type) a -> m (Either e a)
- Control.Monad.Error: catchError :: MonadError m => m a -> (ErrorType m -> m a) -> m a
- Control.Monad.Error: class Error a
- Control.Monad.Error: class (Monad m) => MonadError m where {
- Control.Monad.Error: mapErrorT :: (m (Either e a) -> n (Either e' b)) -> ErrorT e m a -> ErrorT e' n b
- Control.Monad.Error: newtype ErrorT e (m :: Type -> Type) a
- Control.Monad.Error: throwError :: MonadError m => ErrorType m -> m a
- Control.Monad.Error: type ErrorType m;
- Control.Monad.Error: }
- Control.Monad.Error.Class: catchError :: MonadError m => m a -> (ErrorType m -> m a) -> m a
- Control.Monad.Error.Class: class Error a
- Control.Monad.Error.Class: class (Monad m) => MonadError m where {
- Control.Monad.Error.Class: instance (GHC.Base.Monad m, Control.Monad.Trans.Error.Error e) => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.Error.ErrorT e m)
- Control.Monad.Error.Class: instance (GHC.Base.Monoid w, Control.Monad.Error.Class.MonadError m) => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
- Control.Monad.Error.Class: instance (GHC.Base.Monoid w, Control.Monad.Error.Class.MonadError m) => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.RWS.Strict.RWST r w s m)
- Control.Monad.Error.Class: instance (GHC.Base.Monoid w, Control.Monad.Error.Class.MonadError m) => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.Writer.Lazy.WriterT w m)
- Control.Monad.Error.Class: instance (GHC.Base.Monoid w, Control.Monad.Error.Class.MonadError m) => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.Writer.Strict.WriterT w m)
- Control.Monad.Error.Class: instance Control.Monad.Error.Class.MonadError GHC.Types.IO
- Control.Monad.Error.Class: instance Control.Monad.Error.Class.MonadError m => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.Identity.IdentityT m)
- Control.Monad.Error.Class: instance Control.Monad.Error.Class.MonadError m => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.List.ListT m)
- Control.Monad.Error.Class: instance Control.Monad.Error.Class.MonadError m => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.Maybe.MaybeT m)
- Control.Monad.Error.Class: instance Control.Monad.Error.Class.MonadError m => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Error.Class: instance Control.Monad.Error.Class.MonadError m => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.State.Lazy.StateT s m)
- Control.Monad.Error.Class: instance Control.Monad.Error.Class.MonadError m => Control.Monad.Error.Class.MonadError (Control.Monad.Trans.State.Strict.StateT s m)
- Control.Monad.Error.Class: instance Control.Monad.Trans.Error.Error e => Control.Monad.Error.Class.MonadError (Data.Either.Either e)
- Control.Monad.Error.Class: noMsg :: Error a => a
- Control.Monad.Error.Class: strMsg :: Error a => String -> a
- Control.Monad.Error.Class: throwError :: MonadError m => ErrorType m -> m a
- Control.Monad.Error.Class: type ErrorType m;
- Control.Monad.Error.Class: }
- Control.Monad.List: ListT :: m [a] -> ListT (m :: Type -> Type) a
- Control.Monad.List: [runListT] :: ListT (m :: Type -> Type) a -> m [a]
- Control.Monad.List: mapListT :: (m [a] -> n [b]) -> ListT m a -> ListT n b
- Control.Monad.List: newtype ListT (m :: Type -> Type) a
- Control.Monad.RWS.Class: instance (Control.Monad.Trans.Error.Error e, Control.Monad.RWS.Class.MonadRWS m) => Control.Monad.RWS.Class.MonadRWS (Control.Monad.Trans.Error.ErrorT e m)
- Control.Monad.Reader.Class: instance (Control.Monad.Trans.Error.Error e, Control.Monad.Reader.Class.MonadReader m) => Control.Monad.Reader.Class.MonadReader (Control.Monad.Trans.Error.ErrorT e m)
- Control.Monad.Reader.Class: instance Control.Monad.Reader.Class.MonadReader m => Control.Monad.Reader.Class.MonadReader (Control.Monad.Trans.List.ListT m)
- Control.Monad.State.Class: instance (Control.Monad.Trans.Error.Error e, Control.Monad.State.Class.MonadState m) => Control.Monad.State.Class.MonadState (Control.Monad.Trans.Error.ErrorT e m)
- Control.Monad.State.Class: instance Control.Monad.State.Class.MonadState m => Control.Monad.State.Class.MonadState (Control.Monad.Trans.List.ListT m)
- Control.Monad.Writer.Class: instance (Control.Monad.Trans.Error.Error e, Control.Monad.Writer.Class.MonadWriter m) => Control.Monad.Writer.Class.MonadWriter (Control.Monad.Trans.Error.ErrorT e m)
Files
- Control/Monad/Cont/Class.hs +3/−11
- Control/Monad/Error.hs +0/−146
- Control/Monad/Error/Class.hs +0/−160
- Control/Monad/Except/Class.hs +0/−1
- Control/Monad/List.hs +0/−27
- Control/Monad/RWS/Class.hs +0/−3
- Control/Monad/Reader/Class.hs +0/−12
- Control/Monad/State/Class.hs +0/−12
- Control/Monad/Writer/Class.hs +0/−7
- changelog.md +14/−0
- monads-tf.cabal +2/−5
Control/Monad/Cont/Class.hs view
@@ -54,10 +54,8 @@ import Control.Monad.Trans.Cont (ContT) import qualified Control.Monad.Trans.Cont as ContT-import Control.Monad.Trans.Error as Error import Control.Monad.Trans.Except as Except import Control.Monad.Trans.Identity as Identity-import Control.Monad.Trans.List as List import Control.Monad.Trans.Maybe as Maybe import Control.Monad.Trans.Reader as Reader import Control.Monad.Trans.RWS.Lazy as LazyRWS@@ -73,9 +71,9 @@ Provides an escape continuation mechanism for use with Continuation monads. Escape continuations allow to abort the current computation and return a value immediately.- They achieve a similar effect to 'Control.Monad.Error.throwError'- and 'Control.Monad.Error.catchError'- within an 'Control.Monad.Error.Error' monad.+ They achieve a similar effect to 'Control.Monad.Except.throwError'+ and 'Control.Monad.Except.catchError'+ within a 'Control.Monad.Except.MonadError' monad. Advantage of this function over calling @return@ is that it makes the continuation explicit, allowing more flexibility and better control@@ -94,17 +92,11 @@ -- --------------------------------------------------------------------------- -- Instances for other mtl transformers -instance (Error e, MonadCont m) => MonadCont (ErrorT e m) where- callCC = Error.liftCallCC callCC- instance (MonadCont m) => MonadCont (ExceptT e m) where callCC = Except.liftCallCC callCC instance (MonadCont m) => MonadCont (IdentityT m) where callCC = Identity.liftCallCC callCC--instance (MonadCont m) => MonadCont (ListT m) where- callCC = List.liftCallCC callCC instance (MonadCont m) => MonadCont (MaybeT m) where callCC = Maybe.liftCallCC callCC
− Control/Monad/Error.hs
@@ -1,146 +0,0 @@-{- |-Module : Control.Monad.Error-Copyright : (c) Michael Weber <michael.weber@post.rwth-aachen.de> 2001,- (c) Jeff Newbern 2003-2006,- (c) Andriy Palamarchuk 2006-License : BSD-style (see the file LICENSE)--Maintainer : ross@soi.city.ac.uk-Stability : experimental-Portability : non-portable (type families)--[Computation type:] Computations which may fail or throw exceptions.--[Binding strategy:] Failure records information about the cause\/location-of the failure. Failure values bypass the bound function,-other values are used as inputs to the bound function.--[Useful for:] Building computations from sequences of functions that may fail-or using exception handling to structure error handling.--[Zero and plus:] Zero is represented by an empty error and the plus operation-executes its second argument if the first fails.--[Example type:] @'Data.Either' String a@--The Error monad (also called the Exception monad).--}--{-- Rendered by Michael Weber <mailto:michael.weber@post.rwth-aachen.de>,- inspired by the Haskell Monad Template Library from- Andy Gill (<http://web.cecs.pdx.edu/~andy/>)--}-module Control.Monad.Error- {-# DEPRECATED "Use Control.Monad.Except instead" #-}- (- -- * Monads with error handling- MonadError(..),- Error,- -- * The ErrorT monad transformer- ErrorT(..),- mapErrorT,- module Control.Monad,- module Control.Monad.Fix,- module Control.Monad.Trans,- -- * Example 1: Custom Error Data Type- -- $customErrorExample-- -- * Example 2: Using ErrorT Monad Transformer- -- $ErrorTExample- ) where--import Control.Monad.Error.Class-import Control.Monad.Trans-import Control.Monad.Trans.Error (ErrorT(..), mapErrorT)--import Control.Monad-import Control.Monad.Fix--{- $customErrorExample-Here is an example that demonstrates the use of a custom 'Error' data type with-the 'throwError' and 'catchError' exception mechanism from 'MonadError'.-The example throws an exception if the user enters an empty string-or a string longer than 5 characters. Otherwise it prints length of the string.-->-- This is the type to represent length calculation error.->data LengthError = EmptyString -- Entered string was empty.-> | StringTooLong Int -- A string is longer than 5 characters.-> -- Records a length of the string.-> | OtherError String -- Other error, stores the problem description.->->-- We make LengthError an instance of the Error class->-- to be able to throw it as an exception.->instance Error LengthError where-> noMsg = OtherError "A String Error!"-> strMsg s = OtherError s->->-- Converts LengthError to a readable message.->instance Show LengthError where-> show EmptyString = "The string was empty!"-> show (StringTooLong len) =-> "The length of the string (" ++ (show len) ++ ") is bigger than 5!"-> show (OtherError msg) = msg->->-- For our monad type constructor, we use Either LengthError->-- which represents failure using Left LengthError->-- or a successful result of type a using Right a.->type LengthMonad = Either LengthError->->main = do-> putStrLn "Please enter a string:"-> s <- getLine-> reportResult (calculateLength s)->->-- Wraps length calculation to catch the errors.->-- Returns either length of the string or an error.->calculateLength :: String -> LengthMonad Int->calculateLength s = (calculateLengthOrFail s) `catchError` Left->->-- Attempts to calculate length and throws an error if the provided string is->-- empty or longer than 5 characters.->-- The processing is done in Either monad.->calculateLengthOrFail :: String -> LengthMonad Int->calculateLengthOrFail [] = throwError EmptyString->calculateLengthOrFail s | len > 5 = throwError (StringTooLong len)-> | otherwise = return len-> where len = length s->->-- Prints result of the string length calculation.->reportResult :: LengthMonad Int -> IO ()->reportResult (Right len) = putStrLn ("The length of the string is " ++ (show len))->reportResult (Left e) = putStrLn ("Length calculation failed with error: " ++ (show e))--}--{- $ErrorTExample-@'ErrorT'@ monad transformer can be used to add error handling to another monad.-Here is an example how to combine it with an @IO@ monad:-->import Control.Monad.Error->->-- An IO monad which can return String failure.->-- It is convenient to define the monad type of the combined monad,->-- especially if we combine more monad transformers.->type LengthMonad = ErrorT String IO->->main = do-> -- runErrorT removes the ErrorT wrapper-> r <- runErrorT calculateLength-> reportResult r->->-- Asks user for a non-empty string and returns its length.->-- Throws an error if user enters an empty string.->calculateLength :: LengthMonad Int->calculateLength = do-> -- all the IO operations have to be lifted to the IO monad in the monad stack-> liftIO $ putStrLn "Please enter a non-empty string: "-> s <- liftIO getLine-> if null s-> then throwError "The string was empty!"-> else return $ length s->->-- Prints result of the string length calculation.->reportResult :: Either String Int -> IO ()->reportResult (Right len) = putStrLn ("The length of the string is " ++ (show len))->reportResult (Left e) = putStrLn ("Length calculation failed with error: " ++ (show e))--}
− Control/Monad/Error/Class.hs
@@ -1,160 +0,0 @@-{- |-Module : Control.Monad.Error.Class-Copyright : (c) Michael Weber <michael.weber@post.rwth-aachen.de> 2001,- (c) Jeff Newbern 2003-2006,- (c) Andriy Palamarchuk 2006-License : BSD-style (see the file LICENSE)--Maintainer : ross@soi.city.ac.uk-Stability : experimental-Portability : non-portable (type families)--[Computation type:] Computations which may fail or throw exceptions.--[Binding strategy:] Failure records information about the cause\/location-of the failure. Failure values bypass the bound function,-other values are used as inputs to the bound function.--[Useful for:] Building computations from sequences of functions that may fail-or using exception handling to structure error handling.--[Zero and plus:] Zero is represented by an empty error and the plus operation-executes its second argument if the first fails.--[Example type:] @'Either' 'String' a@--The Error monad (also called the Exception monad).--}--{-- Rendered by Michael Weber <mailto:michael.weber@post.rwth-aachen.de>,- inspired by the Haskell Monad Template Library from- Andy Gill (<http://web.cecs.pdx.edu/~andy/>)--}-module Control.Monad.Error.Class- {-# DEPRECATED "Use Control.Monad.Except.Class instead" #-}- (- Error(..),- MonadError(..),- ) where--import Control.Monad.Trans.Error (Error(..), ErrorT)-import qualified Control.Monad.Trans.Error as ErrorT (throwError, catchError)-import Control.Monad.Trans.Identity as Identity-import Control.Monad.Trans.List as List-import Control.Monad.Trans.Maybe as Maybe-import Control.Monad.Trans.Reader as Reader-import Control.Monad.Trans.RWS.Lazy as LazyRWS-import Control.Monad.Trans.RWS.Strict as StrictRWS-import Control.Monad.Trans.State.Lazy as LazyState-import Control.Monad.Trans.State.Strict as StrictState-import Control.Monad.Trans.Writer.Lazy as LazyWriter-import Control.Monad.Trans.Writer.Strict as StrictWriter-import Control.Monad.Trans--import qualified Control.Exception--{- |-The strategy of combining computations that can throw exceptions-by bypassing bound functions-from the point an exception is thrown to the point that it is handled.--Is parameterized over the type of error information and-the monad type constructor.-It is common to use @'Data.Either' String@ as the monad type constructor-for an error monad in which error descriptions take the form of strings.-In that case and many other common cases the resulting monad is already defined-as an instance of the 'MonadError' class.-You can also define your own error type and\/or use a monad type constructor-other than @'Data.Either' String@ or @'Data.Either' IOError@.-In these cases you will have to explicitly define instances of the 'Error'-and\/or 'MonadError' classes.--}-class (Monad m) => MonadError m where- type ErrorType m-- -- | Is used within a monadic computation to begin exception processing.- throwError :: ErrorType m -> m a-- {- |- A handler function to handle previous errors and return to normal execution.- A common idiom is:-- > do { action1; action2; action3 } `catchError` handler-- where the @action@ functions can call 'throwError'.- Note that @handler@ and the do-block must have the same return type.- -}- catchError :: m a -> (ErrorType m -> m a) -> m a--instance MonadError IO where- type ErrorType IO = IOError- throwError = ioError- catchError = Control.Exception.catch---- ------------------------------------------------------------------------------ Our parameterizable error monad--instance (Error e) => MonadError (Either e) where- type ErrorType (Either e) = e- throwError = Left- Left l `catchError` h = h l- Right r `catchError` _ = Right r--instance (Monad m, Error e) => MonadError (ErrorT e m) where- type ErrorType (ErrorT e m) = e- throwError = ErrorT.throwError- catchError = ErrorT.catchError---- ------------------------------------------------------------------------------ Instances for other mtl transformers--instance (MonadError m) => MonadError (IdentityT m) where- type ErrorType (IdentityT m) = ErrorType m- throwError = lift . throwError- catchError = Identity.liftCatch catchError--instance (MonadError m) => MonadError (ListT m) where- type ErrorType (ListT m) = ErrorType m- throwError = lift . throwError- catchError = List.liftCatch catchError--instance (MonadError m) => MonadError (MaybeT m) where- type ErrorType (MaybeT m) = ErrorType m- throwError = lift . throwError- catchError = Maybe.liftCatch catchError--instance (MonadError m) => MonadError (ReaderT r m) where- type ErrorType (ReaderT r m) = ErrorType m- throwError = lift . throwError- catchError = Reader.liftCatch catchError--instance (Monoid w, MonadError m) => MonadError (LazyRWS.RWST r w s m) where- type ErrorType (LazyRWS.RWST r w s m) = ErrorType m- throwError = lift . throwError- catchError = LazyRWS.liftCatch catchError--instance (Monoid w, MonadError m) => MonadError (StrictRWS.RWST r w s m) where- type ErrorType (StrictRWS.RWST r w s m) = ErrorType m- throwError = lift . throwError- catchError = StrictRWS.liftCatch catchError--instance (MonadError m) => MonadError (LazyState.StateT s m) where- type ErrorType (LazyState.StateT s m) = ErrorType m- throwError = lift . throwError- catchError = LazyState.liftCatch catchError--instance (MonadError m) => MonadError (StrictState.StateT s m) where- type ErrorType (StrictState.StateT s m) = ErrorType m- throwError = lift . throwError- catchError = StrictState.liftCatch catchError--instance (Monoid w, MonadError m) => MonadError (LazyWriter.WriterT w m) where- type ErrorType (LazyWriter.WriterT w m) = ErrorType m- throwError = lift . throwError- catchError = LazyWriter.liftCatch catchError--instance (Monoid w, MonadError m) => MonadError (StrictWriter.WriterT w m) where- type ErrorType (StrictWriter.WriterT w m) = ErrorType m- throwError = lift . throwError- catchError = StrictWriter.liftCatch catchError
Control/Monad/Except/Class.hs view
@@ -38,7 +38,6 @@ import Control.Monad.Trans.Except (ExceptT) import qualified Control.Monad.Trans.Except as ExceptT (throwE, catchE) import Control.Monad.Trans.Identity as Identity-import Control.Monad.Trans.List as List import Control.Monad.Trans.Maybe as Maybe import Control.Monad.Trans.Reader as Reader import Control.Monad.Trans.RWS.Lazy as LazyRWS
− Control/Monad/List.hs
@@ -1,27 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Control.Monad.List--- Copyright : (c) Andy Gill 2001,--- (c) Oregon Graduate Institute of Science and Technology, 2001--- License : BSD-style (see the file LICENSE)------ Maintainer : ross@soi.city.ac.uk--- Stability : experimental--- Portability : portable------ The List monad.-----------------------------------------------------------------------------------module Control.Monad.List- {-# DEPRECATED "This transformer is invalid on most monads" #-}- (- ListT(..),- mapListT,- module Control.Monad,- module Control.Monad.Trans,- ) where--import Control.Monad-import Control.Monad.Trans-import Control.Monad.Trans.List
Control/Monad/RWS/Class.hs view
@@ -30,7 +30,6 @@ import Control.Monad.State.Class import Control.Monad.Writer.Class -import Control.Monad.Trans.Error(Error, ErrorT) import Control.Monad.Trans.Except(ExceptT) import Control.Monad.Trans.Maybe(MaybeT) import Control.Monad.Trans.Identity(IdentityT)@@ -46,8 +45,6 @@ --------------------------------------------------------------------------- -- Instances for other mtl transformers--instance (Error e, MonadRWS m) => MonadRWS (ErrorT e m) instance (MonadRWS m) => MonadRWS (ExceptT e m)
Control/Monad/Reader/Class.hs view
@@ -41,10 +41,8 @@ ) where import Control.Monad.Trans.Cont as Cont-import Control.Monad.Trans.Error import Control.Monad.Trans.Except import Control.Monad.Trans.Identity-import Control.Monad.Trans.List import Control.Monad.Trans.Maybe import Control.Monad.Trans.Reader (ReaderT) import qualified Control.Monad.Trans.Reader as ReaderT (ask, local)@@ -114,11 +112,6 @@ ask = lift ask local = Cont.liftLocal ask local -instance (Error e, MonadReader m) => MonadReader (ErrorT e m) where- type EnvType (ErrorT e m) = EnvType m- ask = lift ask- local = mapErrorT . local- instance (MonadReader m) => MonadReader (ExceptT e m) where type EnvType (ExceptT e m) = EnvType m ask = lift ask@@ -128,11 +121,6 @@ type EnvType (IdentityT m) = EnvType m ask = lift ask local = mapIdentityT . local--instance (MonadReader m) => MonadReader (ListT m) where- type EnvType (ListT m) = EnvType m- ask = lift ask- local = mapListT . local instance (MonadReader m) => MonadReader (MaybeT m) where type EnvType (MaybeT m) = EnvType m
Control/Monad/State/Class.hs view
@@ -27,10 +27,8 @@ import Control.Monad.Trans (lift) import Control.Monad.Trans.Cont-import Control.Monad.Trans.Error import Control.Monad.Trans.Except import Control.Monad.Trans.Identity-import Control.Monad.Trans.List import Control.Monad.Trans.Maybe import Control.Monad.Trans.Reader import qualified Control.Monad.Trans.RWS.Lazy as LazyRWS (RWST, get, put)@@ -103,11 +101,6 @@ get = lift get put = lift . put -instance (Error e, MonadState m) => MonadState (ErrorT e m) where- type StateType (ErrorT e m) = StateType m- get = lift get- put = lift . put- instance (MonadState m) => MonadState (ExceptT e m) where type StateType (ExceptT e m) = StateType m get = lift get@@ -115,11 +108,6 @@ instance (MonadState m) => MonadState (IdentityT m) where type StateType (IdentityT m) = StateType m- get = lift get- put = lift . put--instance (MonadState m) => MonadState (ListT m) where- type StateType (ListT m) = StateType m get = lift get put = lift . put
Control/Monad/Writer/Class.hs view
@@ -24,7 +24,6 @@ censor, ) where -import Control.Monad.Trans.Error as Error import Control.Monad.Trans.Except as Except import Control.Monad.Trans.Identity as Identity import Control.Monad.Trans.Maybe as Maybe@@ -95,12 +94,6 @@ -- --------------------------------------------------------------------------- -- Instances for other mtl transformers--instance (Error e, MonadWriter m) => MonadWriter (ErrorT e m) where- type WriterType (ErrorT e m) = WriterType m- tell = lift . tell- listen = Error.liftListen listen- pass = Error.liftPass pass instance (MonadWriter m) => MonadWriter (ExceptT e m) where type WriterType (ExceptT e m) = WriterType m
changelog.md view
@@ -1,3 +1,17 @@+## 0.3.0.0++Remove deprecated modules:++* `Control.Monad.Error`+* `Control.Monad.Error.Class`+* `Control.Monad.List`++Add support for `transformers-0.6.*`++Published by: Chris Martin++Date: 2023-07-10+ ## 0.2.1.0 Add `MonadCont`, `MonadReader`, `MonadState`, `MonadRWS`,
monads-tf.cabal view
@@ -1,7 +1,7 @@ cabal-version: 3.0 name: monads-tf-version: 0.2.1.0+version: 0.3.0.0 license: BSD-3-Clause license-file: LICENSE author: Andy Gill@@ -20,12 +20,9 @@ exposed-modules: Control.Monad.Cont Control.Monad.Cont.Class- Control.Monad.Error- Control.Monad.Error.Class Control.Monad.Except Control.Monad.Except.Class Control.Monad.Identity- Control.Monad.List Control.Monad.RWS Control.Monad.RWS.Class Control.Monad.RWS.Lazy@@ -43,7 +40,7 @@ Control.Monad.Writer.Strict build-depends: , base ^>= 4.16 || ^>= 4.17 || ^>= 4.18- , transformers ^>= 0.5.6+ , transformers ^>= 0.5.6 || ^>= 0.6 default-extensions: TypeFamilies default-language: GHC2021