Haskell 我应该将ReaderT与StateT一起使用,还是只使用StateT monad?
我有以下数据类型:Haskell 我应该将ReaderT与StateT一起使用,还是只使用StateT monad?,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,我有以下数据类型: data CheckState = CheckState { envs :: [Env] , curPos :: SrcSpan , inLoop :: Bool , sourceCode :: Text } 现在,此数据类型在StateT mo
data CheckState = CheckState { envs :: [Env]
, curPos :: SrcSpan
, inLoop :: Bool
, sourceCode :: Text
}
现在,此数据类型在StateT monad中使用:
func :: (MonadState CheckState m, MonadError Text m) => m a
但它的两条记录可以放在ReaderT monad中:
data CheckState = CheckState { envs :: [Env]
, curPos :: SrcSpan
}
data CheckContext = CheckContext { inLoop :: Bool
, sourceCode :: Text
}
func :: (MonadReader CheckContext m, MonadState CheckState m, MonadError Text m)
=> m a
我应该使用哪种方法,第一种还是第二种?这可能是一个意见问题,在这种情况下,堆栈溢出是无关紧要的,但对我来说,如果您确定您的部分状态将是只读的,那么第二种方法更有意义。请注意,已经有一个RWST monad transformer,它将读写器、写写器和状态组合在一起,您在这里不使用Writer,但可以很容易地忽略这一部分。在这种情况下,这可能是一个观点问题,堆栈溢出与此无关,但对我来说,如果您确定您的部分状态将是只读的,那么第二种方法更有意义。请注意,已经有一个RWST monad转换器,它将读写器、写器和状态组合在一个您在这里不使用Writer的转换器中,但可以轻松忽略该部分。