У меня есть конвейер, монада которого включает состояние. В какой-то момент я хотел бы иметь канал, который передает состояние следующим (это упрощенная версия того, что мне действительно нужно).
Но у меня проблемы с этим. В следующем примере состояние передается только один раз из yield:
import Conduit (ConduitM, yield)
import Control.Monad.Except (Except)
import Control.Monad.State.Lazy (StateT, get)
type CondState = String
type CondMonad = StateT CondState (Except String)
passState :: ConduitM i CondState CondMonad ()
passState = do
state <- get
yield state
Если я побегу
runExcept $ (runStateT . runConduit $ yieldMany [(1::Int)..] .| passState .| sinkList) "state"
я получил
Right (["state"], "state")
а не бесконечный список, к которому я стремлюсь в первой позиции кортежа.
В реальном приложении состояние меняется по мере движения канала.
Любые идеи?