2
프로그램의 여러 수준에서 컨트롤 구조에 대한 두 가지 형식 선언이 있습니다. 하단에는 Agent
, StateT
및 IO
기능이 있습니다. 두 번째 것은 StateT
이고 다른 하나는 Agent
이며 세 번째 것 (Plan
)은 ErrorT
입니다.중첩 된 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' 함수를 정의 할 수 있으므로, 호출 할 때마다가 아니라 한 번만 스택해야합니다. –
그러나'runPlan'은'runStateT'와'runErrorT'를 함께 사용하는 마지막 표현식처럼 정의 될 것입니다, 맞습니까? 일반적으로 지름길은 없습니다. 모나드 변압기 스택을 사용하여 실행하려면'runXyzT'를 적재해야합니다. 아마 바보 같은 질문에 대해 유감 스럽지만 MTL을 처음 접했을 때 조금 어려움을 느꼈습니다. –
오른쪽. 어떤 곳에서는'runXyzT'를 호출해야합니다. 주위를 둘러 볼 방법이 없습니다. 그러나 한 곳에서 처리하는 것만으로도 충분하므로 많은'Plan'을 실행하면 매번 명시 적으로 스택을 반복 할 필요가 없습니다. 그 질문은 분명히 바보가 아닙니다. –