2012-02-23 2 views
2

프로그램의 여러 수준에서 컨트롤 구조에 대한 두 가지 형식 선언이 있습니다. 하단에는 Agent, StateTIO 기능이 있습니다. 두 번째 것은 StateT이고 다른 하나는 Agent이며 세 번째 것 (Plan)은 ErrorT입니다.중첩 된 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' 함수를 정의 할 수 있으므로, 호출 할 때마다가 아니라 한 번만 스택해야합니다. –

+0

그러나'runPlan'은'runStateT'와'runErrorT'를 함께 사용하는 마지막 표현식처럼 정의 될 것입니다, 맞습니까? 일반적으로 지름길은 없습니다. 모나드 변압기 스택을 사용하여 실행하려면'runXyzT'를 적재해야합니다. 아마 바보 같은 질문에 대해 유감 스럽지만 MTL을 처음 접했을 때 조금 어려움을 느꼈습니다. –

+1

오른쪽. 어떤 곳에서는'runXyzT'를 호출해야합니다. 주위를 둘러 볼 방법이 없습니다. 그러나 한 곳에서 처리하는 것만으로도 충분하므로 많은'Plan'을 실행하면 매번 명시 적으로 스택을 반복 할 필요가 없습니다. 그 질문은 분명히 바보가 아닙니다. –

답변

5

모나드 변압기 스택이있는 경우 각 변압기의 runXyzT 기능이 어느 시점에서 호출되어야하며 불행히도 지름길은 없습니다.

그러나 특정 스택을 두 번 이상 사용하는 경우 특수한 runMyStack 함수를 정의하면 누적 된 runXyzT의 혼란이 한 지점에만 나타납니다.

관련 문제