如何很好地评估嵌套的状态和错误monad?

时间:2012-02-23 14:21:23

标签: haskell monads monad-transformers

我在程序的不同级别有两个类型的控件结构声明。最下面一个是AgentStateT具有IO功能。第二个是具有StateT功能的另一个Agent,第三个(Plan)是ErrorT

type Agent = StateT AgentState IO
type Plan = ErrorT PlanError (StateT PlanState Agent)

评估Plan的最佳方式是什么?我编写了以下代码,但它不是很少,因为有大量嵌套的runStateTrunErrorT调用。

foo :: Plan ()
defaultAgentState :: AgentState
runStateT (runStateT (runErrorT foo) (PlanState 0)) defaultAgentState

有更简单/更好的东西吗?

1 个答案:

答案 0 :(得分:5)

如果你有一个monad变换器堆栈,那么必须在某个时刻调用各个变换器的runXyzT个函数,遗憾的是没有捷径。

但是,如果您多次使用特定堆栈,则定义一个特殊的runMyStack函数是值得的,这样堆叠的runXyzT的混乱只出现在一个点上。