2012-02-23 2 views
2

私は、プログラムの異なるレベルでコントロール構造のための2つの型宣言を持っています。下の1つはAgentStateTIOの機能です。もう1つはでAgentの機能を持ち、3番目の機能はです。入れ子状態のStateTと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 

もっとシンプルなものがありますか?

+0

'runPlan'関数を定義することができます。したがって、呼び出すたびにではなく、1回だけスタックする必要があります。 –

+0

しかし、 'runPlan'は' runStateT'と 'runErrorT'を組み合わせた最後の式とまったく同じように定義されますか?一般的にはショートカットはありません。モナド・トランスのスタックを実行するには、適切な量の 'runXyzT'をスタックする必要があります。 恐らく疑わしい質問には申し訳なく思っていますが、私はMTLの新機能ですが、少し難しいと感じています。 –

+1

右。いくつかの場所では 'runXyzT'のそれぞれを呼び出さなければならないが、その周りには道はない。しかし、それを1か所で行うだけで十分です。したがって、多くの 'Plan'sを実行する場合、毎回スタックを明示的に繰り返す必要はありません。ちなみに、質問は間違いなく愚かではありません。 –

答えて

5

モナドトランススタックを使用している場合は、個々のトランスの機能のそれぞれが呼び出される必要がありますが、残念ながらショートカットはありません。

ただし、特定のスタックを複数回使用すると、runMyStackという特殊な関数を定義する価値があるため、スタックされたrunXyzTのクラッタは1つのポイントにのみ表示されます。

関連する問題