问题标签 [conduit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
exception - 在 MonadResource 实例中捕获 IO 异常
简洁版本
与此处相同的问题,但在通用MonadResource
实例中而不是在明确的ResourceT m
.
长版
您将如何定义catch
这样的函数:
我遇到的问题是:
- 在
Control.Exception
,catch
仅适用于裸IO
s ; - 在
Control.Exception.Lifted
,catch
需要一个 的实例MonadBaseControl
,MonadResource
不幸的是不是(我想知道为什么); MonadResource
暗示MonadThrow
它定义了一个monadThrow
没有“catch”等价物的函数(我想知道为什么);
看起来处理IO
异常的唯一方法是退出ResourceT
层,这让我很困扰:我希望能够在本地处理异常,而无需通过 monad 转换器堆栈。
有关信息,在我的真实代码中,a
实际上b
是http
来自Network.HTTP.Conduit
.
感谢您的见解。
有问题的最少代码
ghc --make example.hs
与安装的库一起编译http-conduit
:
执行时,该程序以错误结束,输出如下:
haskell - Word8 - Conduit 中的 ByteString 编码翻译
我正在尝试让一个 telnet 客户端作为一个辅助项目工作,我将此要点视为一个基本示例。但是,当我在 ghci 中编译并运行它时,您会看到编码出现乱码。以下是人物参考:
我的猜测是,这是因为当 telnet 使用7-bit ASCII / special telnet bit for codes时,Conduit 对于所有传输默认为 UTF-8 。此外,stdout / 终端是否能够直接解释 UTF-8,而无需进行任何转换?
先感谢您!
haskell - 什么是管道/导管试图解决
我见过有人为各种惰性 IO 相关任务推荐管道/导管库。这些库究竟解决了什么问题?
此外,当我尝试使用一些与 hackage 相关的库时,很可能存在三个不同的版本。例子:
这让我很困惑。对于我的解析任务,我应该使用 attoparsec 还是 pipe-attoparsec/attoparsec-conduit?与普通的 attoparsec 相比,管道/导管版本给我带来了什么好处?
haskell - 导管:从另一个来源制作一个来源
我正在抓取一些网站的源代码并Category
从中收集类型的项目:
下一步是编写公司收集器(项目类型Company
)。公司收集器需求类别:对于每个Category
输入,应该生成几个公司,一个接一个。换句话说,它应该“屈服” Company
,而不是[Company]
。这个任务我需要什么?导管还是棘手的来源?如果是来源,它应该如何从中获取类别catsSource
?如果管道被发现时它应该如何通过(“屈服”)公司前进?
在这里清除我的问题是一种尝试(不通过类型检查):
haskell - 管道 - 管道内的多个输出文件
我正在编写一个程序,其中输入文件被拆分为多个文件(Shamir 的秘密共享方案)。
这是我想象的管道:
- 来源:使用 Conduit.Binary.sourceFile 从输入中读取
- 管道:接受一个 ByteString,产生 [ByteString]
- sink:从管道中获取 [ByteString],并将每个 ByteString(在 [ByteString] 中)写入其相应的文件。(假设我们的输入 [ByteString] 被称为 bsl,那么
bsl !! 0
将被写入文件 0、bsl !! 1
文件 1 等等)
我在这里发现了一个关于多个输入文件的问题,但在他们的情况下,整个管道为每个输入文件运行一次,而对于我的程序,我正在写入管道中的多个输出文件。
我也在查看这里的 Conduit 源代码,看看我是否可以自己实现一个 multiSinkFile,但我对 sinkFile 的 Consumer 类型有点困惑,如果我尝试更深入地挖掘,更是如此......(我是还是初学者)
所以,问题是,我应该如何实现像 multiSinkFile 这样的函数,它允许将多个文件作为接收器的一部分写入?
任何提示表示赞赏!
澄清
假设我们要对包含二进制值“ABCDEF”(分为 3 部分)的文件进行 Shamir 的秘密共享。
(所以我们有我们的输入文件srcFile
和我们的输出文件outFile0
,outFile1
和outFile2
)
我们首先从文件中读取“ABC”,然后进行处理,这将为我们提供一个列表,例如["133", "426", "765"]
. 所以"133"
将被写入到outFile0
,"426"
到outFile1
和"765"
到outFile2
。然后我们从 中读取“DEF” srcFile
,对其进行处理,并将相应的输出写入每个输出文件。
编辑:
谢谢您的回答。我花了一些时间来了解 ZipSinks 等的情况,并且我编写了一个简单的测试程序,它接受源文件的输入并将其简单地写入 3 个输出文件。希望这将在未来对其他人有所帮助。
haskell - 将文件中的行与从文件名派生的时间戳组合起来
我有一个目录,里面有我需要解析和处理的 CSV 转储文件。每个文件名都包含一个我知道如何提取的时间戳。然后我需要处理转储中的所有行,但是对于每一行,我需要知道它来自什么文件时间戳。我可以单独获取时间戳,并且可以分别从文件中获取所有行(按照我如何在 Haskell 中实现“cat”?),但找不到组合它们的方法。有任何想法吗?
编辑:感谢 acomar,我有这个解决方案:
谁能想到一种方法,包括将一个包含时间戳的管道与另一个包含文件行的管道压缩在一起?这就是我在问这个问题之前试图做的事情。
haskell - Conduit - Combining multiple Sources/Producers into one
I'm reading from a file using sourceFile
, but I also need to introduce randomness into the processing operation. The best approach I believe is to have a producer that is of the type
where StdGen is used to generate the random number.
I'm intending for the producer to perform the task of sourceFile, as well as producing a new seed to yield everytime it sends data downstream.
My problem is, there doesn't seem to be a source-combiner like zipSink
for sinks. Reading through Conduit Overview, it seems to be suggesting that you can embed a Source
inside a Conduit
, but I'm failing to see how it is done in the example.
Can anyone provide an example of which you fuse two or more IO sources into one single Producer
/Source
?
EDIT :
An example:
So this example takes what's in the input file and write it to the output file, as well as appending a random ASCII value between 40 and 50 to the end of the file. (Don't ask me why)
haskell - Conduit - 将 ByteString 源拆分为字节块
我们得到sourceFile
一个 ByteString 流。
参考我的另一个问题“将多个源/生产者组合成一个”,我能够使用 获取 (StdGen, ByteString)的源ZipSink
,sourceFile
以及生成无限 StdGen 流的自定义源。
我想要实现的是将每个 StdGen 与一个字节的 ByteString 配对,但是在我当前的实现中,我得到一个 StdGen 与来自sourceFile
.
我已经研究了Conduit.Binary
's 的isolate
功能,但是当我使用如下时它似乎对我不起作用:
在 Conduit 术语中,我认为isolate
会做一个await
,产生head
传入的 ByteString 流,leftOver
其余的(将它放回传入流的队列)。基本上,我要做的是将传入的 ByteString 流切成字节块。
我是否正确使用它?如果isolate
不是我应该使用的功能,那么任何人都可以提供另一个将其拆分为任意字节块的功能吗?
haskell - 如何读取上传文件的内容
我正在尝试上传 CSV 文件并将其解析为最终将存储到数据库中的表。我在玩 Yesod 的文件上传示例,但我似乎无法让它与最新版本的 Yesod 一起工作。我正在使用Yesod 1.2.5.2 and GHC 7.6.3 on Ubuntu 14.04
.
下面是我的代码
这是我想得到你帮助的部分:
一旦我有了 ByteString,我将使用 Data.Csv 来解析它:decode NoHeader s :: Either String (Vector (Vector ByteString))
有人可以让我知道如何从上传的文件中获取文件内容吗?我不需要将文件存储在磁盘上。
谢谢!
haskell - 惯用的 io-streams 目录遍历
我在 Reddit 上讨论了一些代码,这让我很好奇这将如何在 io-streams 中实现。考虑以下代码,它遍历目录结构并打印出所有文件名:
假设我们想要创建某种流文件路径表示,而不是简单地打印文件。我知道这在枚举器、管道和管道中是如何工作的。但是,由于中间步骤需要获取稀缺资源(DirStream
),我不确定 io-streams 的实现是什么。有人可以提供一个如何做到这一点的例子吗?
为了比较,这里是管道实现,它是通过bracketP
和实现的MonadResource
。下面是如何使用管道代码来实现与上面相同的文件打印程序: