簡體   English   中英

如何使用管道狀態?

[英]How to use State with Pipes?

我有一個類型Map Int String -> Proxy () a () Void IO b的函數。 現在它await s,做任何有價值的東西,然后重新調用自己。 我想將它更改為使用State (Map Int String)而不是將其作為參數傳遞,因此我可以forever使用並且不需要讓每個分支都記得遞歸。 我知道我需要使用StateTState與另一個monad結合起來,但我不明白StateT所屬的那種類型簽名在StateT ,或者我是否需要liftget這樣的函數。 對於既是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM