Потоковое состояние монады Conduit

У меня есть конвейер, монада которого включает состояние. В какой-то момент я хотел бы иметь канал, который передает состояние следующим (это упрощенная версия того, что мне действительно нужно).

Но у меня проблемы с этим. В следующем примере состояние передается только один раз из 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")

а не бесконечный список, к которому я стремлюсь в первой позиции кортежа.

В реальном приложении состояние меняется по мере движения канала.

Любые идеи?


person jorgen    schedule 04.12.2017    source источник


Ответы (1)


Оказывается, решение что-то вроде

passState = mapMC $ \_ -> do
  state <- get
  return state
person jorgen    schedule 05.12.2017