gpt4 book ai didi

haskell - 如何将状态与管道一起使用?

转载 作者:行者123 更新时间:2023-12-04 13:19:22 30 4
gpt4 key购买 nike

我有一个类型为 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com