gpt4 book ai didi

haskell - Pipes.Binary.decode - StateT 有什么用?

转载 作者:行者123 更新时间:2023-12-04 07:38:34 25 4
gpt4 key购买 nike

我正在尝试使用管道和构建在它上面的各种库来编写一个基本的网络服务器。预期的流程是:

从套接字获取字节串 -> 使用二进制解码 -> 服务器逻辑在这里 -> 向套接字发送响应

我认为会是这样的:

fromSocket s 4096 >-> decode >-> serverLogic >-> toSocket s

管道二进制有 decodedecodeMany ,但我不确定我是否理解其中的区别,我不知道如何使用 decode .为什么 decodeMany将上游管道作为参数,而不是用 >-> 链接它?以及如何使用 decode ,什么是 StateT我的管道链最终应该是什么样子?

最佳答案

StateT (Producer a m r) m x成语来自 pipes-parse 's "Low-level Parsers" .这通常意味着库正在使用 drawunDrawProducer 中提取值并在它们未使用时归还它们。它是解析可能发生故障的重要组成部分。它还需要 StateT层以指示管道正在以有状态的方式有选择地排空和重新填充。

-- | Draw one element from the underlying Producer, 
-- returning Left if the Producer is empty
draw :: Monad m => StateT (Producer a m r) m (Either r a)

-- | Push back an element onto the underlying Producer
unDraw :: Monad m => a -> StateT (Producer a m r) m ()

那么这对 decode 意味着什么?和 decodeMany ?如果我们看一下这些函数的一些简化类型
-- for (Monad m, Binary b)

decode :: StateT (Producer ByteString m r) m (Maybe b)
decodeMany :: Producer ByteString m r
-> Producer' b m (Either (Producer ByteString m r) r)

我们首先看到 decodedrawing够了 ByteString来自 Producer ByteString 的 block 有状态地尝试解析 b .由于 ByteString 上的 block 边界s 可能与解析边界不对齐,在 StateT 中执行此操作很重要这样剩余的 block 可以是 unDraw -ed 回到 Producer .
decodeMany建立在 decode 之上并尝试反复 decode b s 关闭输入生产者返回“延续” Producer剩余的 ByteString s 失败。

长话短说,由于需要 unDraw剩菜 ByteString block ,我们可以用 (>->) 将这些东西组合成一个链.如果你想这样做,你可以使用像 decodeMany 这样的东西。转换生产者然后链接结果,但您需要仔细处理错误情况。

关于haskell - Pipes.Binary.decode - StateT 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21503772/

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