管道流monad状态

时间:2017-12-04 18:09:37

标签: haskell yield conduit statet

我有一个管道管道,其monad包含州。有一次,我想有一个管道将状态流式传输到下面的状态(这是我实际需要的简化版本)。

但是我很难做到这一点。以下示例仅从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")

而不是我在第一个元组位置上的无限列表。

在实际应用中,状态随着管道流而变化。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

结果解决方案就像是

passState = mapMC $ \_ -> do
  state <- get
  return state