[英]How to use State with Pipes?
我有一個類型Map Int String -> Proxy () a () Void IO b
的函數。 現在它await
s,做任何有價值的東西,然后重新調用自己。 我想將它更改為使用State (Map Int String)
而不是將其作為參數傳遞,因此我可以forever
使用並且不需要讓每個分支都記得遞歸。 我知道我需要使用StateT
將State
與另一個monad結合起來,但我不明白StateT
所屬的那種類型簽名在StateT
,或者我是否需要lift
像get
這樣的函數。 對於既是State (Map Int String)
又是Proxy () a () Void IO b
的函數,正確的類型是什么?
注意: Proxy () a () Void = Consumer a
,所以我將它稱為此答案的Consumer
。
簡單的方法是將StateT
monad變換器層放在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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.