- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 network-conduit
时遇到以下代码问题:
import Data.Conduit.List as CL
import Data.Conduit.Text as CT
import qualified Data.ByteString.Char8 as S8
import qualified Data.Text as TT
mySource :: ResourceT m => Integer -> Source m Int
mySource i = {- function -} undefined
myApp :: Application
myApp src snk =
src $= CT.decode CT.ascii
$= CL.map decimal
$= CL.map {-problem here-}
$$ src
在有问题的地方我想写一些类似的东西
\t -> case t of
Left err = S8.pack $ "Error:" ++ e
Right (i,xs) = (>>>=) mySource
{- or better:
do
(>>>=) mySource
(<<<=) T.pack xs
-}
其中 (>>>=)
功能推送mySource
输出到下一个级别并且 (<<<=)
正在将函数发送回上一级
最佳答案
网络将字节流切割成任意的ByteString
大块。通过上面的代码,那些 ByteString
block 将被映射到 Text
的 block ,以及 Text
的每个 block 将被解析为 decimal
。然而,一串十进制数字代表单个 decimal
可以分为两个(或多个)Text
大块。另外,正如您所意识到的,使用 decimal
返回 Text
的剩余部分没有被解析为 decimal
的一部分的 block ,您正尝试将其推回到输入流中。
这两个问题都可以通过使用 Data.Conduit.Attoparsec. conduitParserEither
来解决与 Data.Attoparsec.Text.decimal
。请注意,仅解析 decimal
是不够的。 ;您还需要处理 decimal
之间的某种分隔符s。
也无法拼接 Source
来自CL.map
,自 CL.map
的类型签名是
map :: Monad m => (a -> b) -> Conduit a m b
您传递给 map
的函数有机会转换每个输入a
转换为单个输出 b
,不是 b
的流的。为此,您可以使用 awaitForever
,但您需要转换您的 Source
成将军Producer
与 toProducer
为了使类型匹配。
但是,在您的代码中,您尝试向下游发送解析错误 ByteString
的,但是 mySource
的输出如Int
的,这是一个类型错误。您必须提供 ByteString
的流在这两种情况下;成功的解析案例可以返回 Conduit
通过融合其他制成Conduit
只要最终输出为 ByteString
即可:
...
$= (let f (Left err) = yield $ S8.pack $ "Error: " ++ show err
f (Right (_, i)) = toProducer (mySource i) $= someOtherConduit
in awaitForever f)
哪里someOtherConduit
沉没Int
来自 mySource
和来源ByteString
的。
someOtherConduit :: Monad m => Conduit Int m ByteString
最后,我相信您的意思是连接 snk
在管道末端而不是 src
.
关于haskell - 如何在管道haskell内添加新源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9226780/
我是一名优秀的程序员,十分优秀!