У меня есть два объявления типа для управляющих структур на разных уровнях программы. Нижний — 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
Есть ли что-то проще/красивее?
runPlan
, поэтому вам нужно будет складывать только один раз, а не каждый раз, когда вы ее вызываете. - person Daniel Fischer   schedule 23.02.2012runPlan
будет определено точно так же, как мое последнее выражение, объединяющееrunStateT
иrunErrorT
, верно? В общем, ярлыка нет. Если у меня есть стек преобразователей монад, чтобы запустить их, мне нужно сложить нужное количествоrunXyzT
. Прошу прощения за, возможно, глупый вопрос, но я совсем новичок в MTL, мне все еще кажется, что это немного сложно. - person Riccardo T.   schedule 23.02.2012runXyzT
должен вызываться, и это невозможно. Но достаточно сделать это в одном месте, поэтому, если вы выполняете многоPlan
, вам не нужно каждый раз явно повторять стек. Кстати, вопрос определенно не глупый. - person Daniel Fischer   schedule 23.02.2012State
,get
,put
,modify
,gets
и т. д., чтобы скрытьlift
и сделать понятным, когда вы работаете сAgentState
по сравнению сPlanState
. - person pat   schedule 23.02.2012