我有一个带有Map Int String -> Proxy () a () Void IO b类型的函数。现在它是await,用它得到的值做任何事情,然后重新调用自己。我希望将其更改为使用State (Map Int String),而不是将其作为参数传递,因此我只需使用forever,而不需要让每个分支记住递归。我明白,我需要使用StateT将State与另一个monad组合起来,但我不知道StateT属于哪种类型的签名,或者是否需要像get这样的lift函数。State (Map Int String)和Proxy () a () Void IO b函数的正确类型是什么?
发布于 2014-02-13 02:15:58
注意:Proxy () a () Void = Consumer a,所以对于这个答案,我将把它称为Consumer。
简单的方法是将您的StateT单台转换器层置于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)..。这就是它在行动中的表现:
>>> runEffect $ each ["Test", "ABC"] >-> example
Received value #0: "Test"
Received value #1: "ABC"https://stackoverflow.com/questions/21743755
复制相似问题