Как правильно оценить вложенные монады StateT и ErrorT? - PullRequest
3 голосов
/ 23 февраля 2012

У меня есть два объявления типа для управляющих структур на разных уровнях в программе. Нижний - 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

Есть ли что-нибудь попроще / приятнее?

1 Ответ

6 голосов
/ 23 февраля 2012

Если у вас есть стек монадных трансформаторов, каждая из функций runXyzT отдельных трансформаторов должна быть вызвана в какой-то момент, к сожалению, быстрого вызова нет.

Однако, если вы используете определенный стекболее одного раза целесообразно определить специальную функцию runMyStack, чтобы беспорядок в суммированных runXyzT появлялся только в одной точке.

...