packages feed

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 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