3

对于程序中不同级别的控制结构,我有两种类型声明。底部是Agent, 一个StateT具有IO功能的。第二个是另一个StateTAgent能力的,第三个(Plan)是一个ErrorT

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

评估 a 的最佳方法是Plan什么?我写了下面的代码,但它不是很少,因为有很多嵌套runStateTrunErrorT调用。

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

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

4

1 回答 1

6

如果您有一个单子转换器堆栈,runXyzT则必须在某个时候调用各个转换器的每个功能,不幸的是没有捷径可走。

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

于 2012-02-23T16:31:54.963 回答