问题标签 [lazy-io]

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.

0 投票
2 回答
279 浏览

haskell - 强制对惰性 IO 进行评估

我的程序从网络套接字读取一行并将其写入磁盘。由于行可能真的很长而且字符串的性能很差,我开始使用惰性字节字符串。现在看来,Haskell 将通过hClose磁盘文件句柄而不将整个字节字符串实际刷新到磁盘,这样做:

  • 打开文件进行写入
  • 将字节字符串写入文件hPut
  • 关闭文件
  • 打开文件进行阅读

通常会导致openFile: resource busy (file is locked).

是否可以在关闭文件之前强制执行评估并等待写入整个字节字符串,所以我可以确定在该操作之后文件实际上是关闭的?

0 投票
2 回答
318 浏览

haskell - 一元动作的延迟输出

我有下一个单子变压器:

基本上,它使用 Iteratee读取和处理pdf文档的底层(需要随机访问源,这样它就不会一直将文档保存在内存中)。

我需要实现一个保存pdf文档的功能,我希望它是懒惰的,应该可以将文档保存在常量内存中。

我可以产生懒惰ByteString

但实际输出可能取决于先前的输出。(详细信息:pdf 文档包含所谓的“参考表”,其中包含文档内每个对象的绝对偏移量(以字节为单位)。这绝对取决于ByteStringpdf 对象序列化到的长度。)

如何确保该函数在将其返回给调用者之前save不会强制执行?ByteString

将回调作为参数并在每次我有输出时调用它会更好吗?

有更好的解决方案吗?

0 投票
1 回答
251 浏览

haskell - `interact` 使用文本而不是字符串

我想重写interact函数,但使用Text而不是String. 是否可以使用Data.Text和/或Data.Text.Lazy完成与 相同的行为interact

例如,当我使用以下命令运行此程序时String

它等待一行输入,然后打印出一行作为响应,并等待下一行输入。我想编写相同的代码并使其适用于Text.

但不要只是textInteract这个用例的特殊情况。interact我希望它在所有情况下的行为都相同。

0 投票
1 回答
580 浏览

haskell - 在 Haskell 中同时读取和写入同一个文件时出错

我需要就地修改文件。所以我打算读取文件内容,处理它们,然后将输出写入同一个文件:

但问题是,只有当我取消注释第 4 行时,它才能按预期工作 - 我只是将字符数输出到控制台。如果我不取消注释,我会得到

有没有办法强制读取该文件?

0 投票
2 回答
323 浏览

haskell - Haskell 懒 Bytestring 字不懒?

我有以下 Haskell 程序来计算一串整数的最大和子串:

这个程序的问题在于它将整个文件读入内存。对应的没有BytesString的程序就没有这个问题:

它只使用少量的恒定内存,但当然速度非常慢(大约慢 25 倍)。

该问题仅发生在读取非常大行的程序中。如果输入分布在多条小行上,ByteString 将按预期执行。

有没有办法解决?

0 投票
1 回答
192 浏览

lazy-evaluation - hGetContents 是如何实现内存效率的?

我想将 Haskell 添加到我的工具箱中,所以我正在通过Real World Haskell工作。

在输入和输出一章中hGetContents我遇到了这个例子:

在此代码示例之后,作者继续说:

请注意,它hGetContents为我们处理了所有的阅读。另外,看看processData。它是一个纯函数,因为它没有副作用,并且每次调用时总是返回相同的结果。在这种情况下,它不需要知道——<em>也没有办法知道——它的输入是从文件中懒惰地读取的。它可以与 20 个字符的文字或磁盘上的 500GB 数据转储完美配合。 (NB重点是我的)

我的问题是:如果没有——在这个例子中—— “能够分辨”,hGetContents或者它的结果值如何实现这种内存效率,并且仍然保持纯代码(即)产生的所有好处,特别是记忆化?processDataprocessData

<- hGetContents inh返回一个字符串,因此inpStr绑定到 type 的值String,这正是processData接受的类型。但是,如果我正确理解 Real World Haskell 的作者,那么这个字符串与其他字符串不太一样,因为它没有完全加载到内存中(或完全评估,如果存在诸如未完全评估的字符串之类的东西...... .) 在调用processData.

因此,问我的问题的另一种方式是:如果inpStr在调用时没有完全评估或加载到内存中,那么如何在没有首先完全评估的情况下processData使用它来查找是否存在记忆调用?processDatainpStr

是否存在String每个行为不同但在这个抽象级别上无法区分的类型实例?

0 投票
4 回答
173 浏览

haskell - Haskell:在惰性 IO 中隐藏故障

这是一个菜鸟问题。

我想写一个函数来提供一个懒惰的图像流,大概是这样的:

不幸的是,读取图像的函数可能会失败,所以它看起来像:

因此,我可以编写的函数如下所示:

如何在保持惰性 IO 的同时实现如下功能?

从语义上讲,当您请求flattenImageStream下一张图片时,它应该遍历列表并尝试读取每张图片。它会执行此操作,直到找到加载的图像并将其返回。

编辑:答案似乎存在一些分歧。有些人建议使用sequence. (我会再次测试它以确定何时回到我的电脑。)有人还建议使用unsafeInterleaveIO. 从该函数的文档来看,它似乎可以工作,但显然我想尽可能地尊重类型系统。

0 投票
2 回答
799 浏览

haskell - 防止“getCurrentDirectory:资源耗尽(打开的文件过多)”错误

我正在尝试对Parsec一大堆小文件运行解析器,并收到一条错误消息,提示我打开的文件太多。我知道我需要使用严格的 IO,但我不知道该怎么做。这是有问题的代码:

注意:我的<<$>>功能是这样的:

0 投票
2 回答
230 浏览

haskell - 读取引用了haskell中其他文件的文件

我正在尝试扩展常规降价,使其能够引用其他文件,以便在“主”文件中的相应位置呈现被引用文件中的内容。

但我来的最远的是实施

ifNExists只是一个可以忽略的助手,真正的问题发生在句柄的读取中,它只是返回空字符串,我认为这是由于惰性 IO。

我认为使用withFile filepath ReadMode $ \handle -> {-do stutff-}hGetContents handle将是正确的解决方案,因为我读过fcontent <- withFile filepath ReadMode hGetContents是一个坏主意。

让我感到困惑的另一件事是功能

奇迹般有效。

那么为什么createF只返回一个空字符串呢?

整个项目和要测试的目录/文件可以在github上找到


这是数据类型定义

0 投票
2 回答
117 浏览

haskell - 如何将延迟流式传输到 foldl' 中?

如何制作自己的流式代码?我正在生成大约 1,000,000,000 对随机的战争套牌,我希望它们能够懒惰地流入 foldl',但我遇到了空间泄漏!这是代码的相关部分:

当我使用 -O2 运行它时,它首先开始冻结我的计算机,然后程序死掉,计算机又恢复了活力(然后谷歌浏览器就有了它需要的资源来对我大喊大叫,因为我用光了它的所有资源。)

注意:我尝试了 unsafeInterleaveIO,但没有成功。

完整代码在: http: //lpaste.net/109977