Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 我应该将ReaderT与StateT一起使用,还是只使用StateT monad?_Haskell_Monads_Monad Transformers - Fatal编程技术网

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的转换器中,但可以轻松忽略该部分。