gpt4 book ai didi

haskell - 如何创建不断重试的枚举器

转载 作者:行者123 更新时间:2023-12-02 16:50:58 25 4
gpt4 key购买 nike

我正在使用 John Millikin 的枚举器包,并尝试创建大致相当于 Data.Enumerator.Binary.enumHandle 的东西,只不过它连接套接字本身,然后尝试枚举生成的句柄。困难在于连接不可靠,我希望它在出现问题时重新连接并恢复枚举。

我通常期望 Enumerator 是它自己有意义的 Monad 实例,但由于它是函数的类型别名,因此它的 Monadic 行为只是其输入步骤的读取器,这在这里似乎没有多大用处。我尝试使用 catchError 将一些东西放在一起,不断循环枚举器,但它没有达到我的预期,而且我无法弄清楚它在做什么,所以我想知道是否有人可以提出一个很好的惯用方法来解决这个问题。我对解决方案的框架很满意,因为显然我省略了许多细节。

有什么想法吗?

最佳答案

你可能必须自己写。我不认为它是在任何地方预定义的。不过,这并不难:

enumConnectAgain :: forall b m. MonadIO m => IO Handle -> Enumerator ByteString m b
enumConnectAgain open step =
fix $ \again -> do
mh <- liftIO (Ex.try open)
case mh of
Left (ex :: SomeException) -> again
Right h -> loop h step

where
loop :: Handle -> Step ByteString m b -> Iteratee ByteString m b
loop h step@(Continue k) = do
mstr <- liftIO (Ex.try $ B.hGetSome h 1024)
case mstr of
Left (ex :: SomeException) -> enumConnectAgain open step
Right str -> k (Chunks [str]) >>== loop h
loop h step = returnI step

这应该有效。

关于haskell - 如何创建不断重试的枚举器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8500643/

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