拥有以下有状态的消费者:
consumer1 :: Consumer a (StateT b m) ()
Run Code Online (Sandbox Code Playgroud)
借助于将其转换为下一个的最佳方法是execStateT什么?
consumer2 :: Consumer a m b
Run Code Online (Sandbox Code Playgroud)
它必须是execStateT吗?这是可以做到用更简单runStateP的Pipes.Lift.
import Pipes
import Pipes.Lift
import Control.Monad.State.Strict
-- unnecessarily specific signature, function work with any Proxy
foo :: Monad m => b -> Consumer a (StateT b m) () -> Consumer a m b
foo b p = liftM snd $ runStateP b p
Run Code Online (Sandbox Code Playgroud)
Pipes.Lift当您拥有不同阶段具有不同效果的管道时,函数会很好.最好将效果限制在需要的管道的特定阶段.