use*_*399 6 haskell haskell-pipes
我有一个类型的功能Map Int String -> Proxy () a () Void IO b.现在它await是s,做任何有价值的东西,然后重新调用自己.我想把它更改为使用State (Map Int String)而不是将其作为参数传递,所以我可以使用forever并且不需要让每个分支都记得递归.我得到了我需要用来与另一个monad StateT结合State,但是我不明白那个类型签名StateT属于哪个,或者我是否需要lift像这样的函数get.对于a State (Map Int String)和a 的函数,正确的类型是Proxy () a () Void IO b什么?
Gab*_*lez 16
注意:Proxy () a () Void = Consumer a所以我将其称为Consumer此答案.
简单的方法是将StateTmonad变换器层放在图层之外,Consumer然后立即运行它.这是一个例子:
import Control.Monad (forever)
import Control.Monad.Trans.State.Strict
import Pipes
example :: (Show a) => Consumer a IO r
example = flip evalStateT 0 $ forever $ do
-- Inside here we are using `StateT Int (Consumer a IO) r`
a <- lift await
n <- get
lift $ lift $ putStrLn $ "Received value #" ++ show n ++ ": " ++ show a
put (n + 1)
Run Code Online (Sandbox Code Playgroud)
......这就是它在行动中的表现:
>>> runEffect $ each ["Test", "ABC"] >-> example
Received value #0: "Test"
Received value #1: "ABC"
Run Code Online (Sandbox Code Playgroud)