我有一个管道管道,其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")
而不是我在第一个元组位置上的无限列表。
在实际应用中,状态随着管道流而变化。
有什么想法吗?
答案 0 :(得分:2)
结果解决方案就像是
passState = mapMC $ \_ -> do
state <- get
return state