В бесплатном интерпретаторе монад используя iterT
, я хотел бы иметь внутреннее состояние, но я не уверен, как это сделать, так как функция iterT
предоставляет продолжение, f
предварительно загруженное рекурсивным вызовом, насколько я понимаю. Я предполагаю, что обертка StateT
является возможным решением (?), но было бы неплохо избежать, если это возможно. Спасибо.
Изменить: чтобы уточнить, внутреннее состояние — это параметр mval
, переданный функции inner
. Я хотел бы выделить ресурс и продолжить работу интерпретатора с этим ресурсом.
import Control.Monad.Trans.Free.Church
import Control.Monad.Free.TH
type SomeFree m = FT SomeFreeF m
data SomeFreeF next = SomeAct (() -> next)
deriving instance (Functor SomeFreeF)
makeFree ''SomeFreeF
runSomeFree :: SomeFree IO () -> IO ()
runSomeFree = inner Nothing
where
inner mval =
iterT \case
SomeAct f -> do
case mval of
Nothing -> do
a <- init
inner (Just a) (FT someAct f ??)
-- How to continue the inner loop with
-- the new state and the continuation `f`?
Just a -> do
f a
iterTM
a>, который запускаетiterT
в монадическом (трансформаторном) контексте. Но не зная точно, что вы хотите сделать, трудно сказать, будет ли это работать. - person Benjamin Hodgson♦   schedule 18.06.2020iterTM
можно будет запустить его внутри StateT. - person Scott   schedule 18.06.2020