1

我有一个管道管道,其单子包括状态。在某一时刻,我想要一个将状态流式传输到以下状态的管道(这是我实际需要的简化版本)。

但我很难做到这一点。以下示例仅从产量中流式传输状态一次:

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")

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

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

有任何想法吗?

4

1 回答 1

2

原来解决方案是这样的

passState = mapMC $ \_ -> do
  state <- get
  return state
于 2017-12-05T01:24:29.397 回答