作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类型为 Map Int String -> Proxy () a () Void IO b
的函数.现在它await
s,用它得到的值做任何事情,然后重新调用它自己。我想将其更改为使用 State (Map Int String)
而不是将其作为参数传递,所以我可以使用 forever
并且不需要让每个分支都记得递归。我知道我需要使用 StateT
结合State
与另一个 monad,但我不明白该类型签名的位置 StateT
属于,或者我是否需要lift
函数如 get
.既是 State (Map Int String)
的函数的正确类型是什么?和 Proxy () a () Void IO b
?
最佳答案
注:Proxy () a () Void = Consumer a
,所以我将其称为 Consumer
对于这个答案。
简单的方法是把你的StateT
Consumer
外的单子(monad)变换层层,然后立即运行。这是一个例子:
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"
关于haskell - 如何将状态与管道一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743755/
我是一名优秀的程序员,十分优秀!