2
私は、プログラムの異なるレベルでコントロール構造のための2つの型宣言を持っています。下の1つはAgent
、StateT
、IO
の機能です。もう1つはでAgent
の機能を持ち、3番目の機能はです。入れ子状態のStateTと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
もっとシンプルなものがありますか?
'runPlan'関数を定義することができます。したがって、呼び出すたびにではなく、1回だけスタックする必要があります。 –
しかし、 'runPlan'は' runStateT'と 'runErrorT'を組み合わせた最後の式とまったく同じように定義されますか?一般的にはショートカットはありません。モナド・トランスのスタックを実行するには、適切な量の 'runXyzT'をスタックする必要があります。 恐らく疑わしい質問には申し訳なく思っていますが、私はMTLの新機能ですが、少し難しいと感じています。 –
右。いくつかの場所では 'runXyzT'のそれぞれを呼び出さなければならないが、その周りには道はない。しかし、それを1か所で行うだけで十分です。したがって、多くの 'Plan'sを実行する場合、毎回スタックを明示的に繰り返す必要はありません。ちなみに、質問は間違いなく愚かではありません。 –