我在程序的不同级别有两个类型的控件结构声明。最下面一个是Agent
,StateT
具有IO
功能。第二个是具有StateT
功能的另一个Agent
,第三个(Plan
)是ErrorT
。
type Agent = StateT AgentState IO
type Plan = ErrorT PlanError (StateT PlanState Agent)
评估Plan
的最佳方式是什么?我编写了以下代码,但它不是很少,因为有大量嵌套的runStateT
和runErrorT
调用。
foo :: Plan ()
defaultAgentState :: AgentState
runStateT (runStateT (runErrorT foo) (PlanState 0)) defaultAgentState
有更简单/更好的东西吗?
答案 0 :(得分:5)
如果你有一个monad变换器堆栈,那么必须在某个时刻调用各个变换器的runXyzT
个函数,遗憾的是没有捷径。
但是,如果您多次使用特定堆栈,则定义一个特殊的runMyStack
函数是值得的,这样堆叠的runXyzT
的混乱只出现在一个点上。