我在 State monad 中有一堆有状态的函数。在程序中的某个时刻,需要一些 IO 操作,所以我将 IO 包装在 StateT 中,得到如下一对类型:
mostfunctions :: State Sometype a
toplevel :: StateT Sometype IO a
为了简单起见,我不想将 IO 上下文传递到主函数集中,并且我想避免将它们包装在 monad 堆栈类型中。但是为了从顶层函数调用它们,我需要类似于电梯的东西,但我并不是想从内部单子中提升一个值。相反,我想将 StateT monad 中的状态转换为 State monad 中的等价物。为此,我有以下内容:
wrapST :: (State Sometype a) -> StateT Sometype IO a
wrapST f = do s <- get
let (r,s2) = runState f s
put s2
return r
然后这习惯于交错如下内容:
toplevel = do liftIO $ Some IO functions
wrapST $ Some state mutations
liftIO $ More IO functions
....
这似乎是一个相当明显的代码块,所以我想知道这个函数是否有一个标准名称,并且它已经在标准库的某个地方实现了?我试图使描述保持简单,但显然这延伸到将一个变压器从堆栈中拉出,将包装的值转换为变压器类型的表亲,跳过堆栈中下面的单子,然后将结果推回结束。