首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何与管道一起使用State?

如何与管道一起使用State?
EN

Stack Overflow用户
提问于 2014-02-13 02:01:03
回答 1查看 798关注 0票数 6

我有一个带有Map Int String -> Proxy () a () Void IO b类型的函数。现在它是await,用它得到的值做任何事情,然后重新调用自己。我希望将其更改为使用State (Map Int String),而不是将其作为参数传递,因此我只需使用forever,而不需要让每个分支记住递归。我明白,我需要使用StateTState与另一个monad组合起来,但我不知道StateT属于哪种类型的签名,或者是否需要像get这样的lift函数。State (Map Int String)Proxy () a () Void IO b函数的正确类型是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-13 02:15:58

注意:Proxy () a () Void = Consumer a,所以对于这个答案,我将把它称为Consumer

简单的方法是将您的StateT单台转换器层置于Consumer层之外,然后立即运行它。下面是一个示例:

代码语言:javascript
运行
复制
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)

..。这就是它在行动中的表现:

代码语言:javascript
运行
复制
>>> runEffect $ each ["Test", "ABC"] >-> example
Received value #0: "Test"
Received value #1: "ABC"
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21743755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档