运行管道的基础monad

Nik*_*kov 3 haskell pipe

拥有以下有状态的消费者:

consumer1 :: Consumer a (StateT b m) ()
Run Code Online (Sandbox Code Playgroud)

借助于将其转换为下一个的最佳方法是execStateT什么?

consumer2 :: Consumer a m b
Run Code Online (Sandbox Code Playgroud)

dan*_*iaz 5

它必须是execStateT吗?这是可以做到用更简单runStatePPipes.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当您拥有不同阶段具有不同效果的管道时,函数会很好.最好将效果限制在需要的管道的特定阶段.

  • 大!实际上存在[一个`execStateP`函数](http://hackage.haskell.org/package/pipes-4.1.2/docs/Pipes-Lift.html#v:execStateP).谢谢! (2认同)