问题标签 [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.
haskell - 强制对惰性 IO 进行评估
我的程序从网络套接字读取一行并将其写入磁盘。由于行可能真的很长而且字符串的性能很差,我开始使用惰性字节字符串。现在看来,Haskell 将通过hClose
磁盘文件句柄而不将整个字节字符串实际刷新到磁盘,这样做:
- 打开文件进行写入
- 将字节字符串写入文件
hPut
- 关闭文件
- 打开文件进行阅读
通常会导致openFile: resource busy (file is locked)
.
是否可以在关闭文件之前强制执行评估并等待写入整个字节字符串,所以我可以确定在该操作之后文件实际上是关闭的?
haskell - 一元动作的延迟输出
我有下一个单子变压器:
基本上,它使用 Iteratee
读取和处理pdf文档的底层(需要随机访问源,这样它就不会一直将文档保存在内存中)。
我需要实现一个保存pdf文档的功能,我希望它是懒惰的,应该可以将文档保存在常量内存中。
我可以产生懒惰ByteString
:
但实际输出可能取决于先前的输出。(详细信息:pdf 文档包含所谓的“参考表”,其中包含文档内每个对象的绝对偏移量(以字节为单位)。这绝对取决于ByteString
pdf 对象序列化到的长度。)
如何确保该函数在将其返回给调用者之前save
不会强制执行?ByteString
将回调作为参数并在每次我有输出时调用它会更好吗?
有更好的解决方案吗?
haskell - `interact` 使用文本而不是字符串
我想重写interact
函数,但使用Text
而不是String
. 是否可以使用Data.Text
和/或Data.Text.Lazy
完成与 相同的行为interact
?
例如,当我使用以下命令运行此程序时String
:
它等待一行输入,然后打印出一行作为响应,并等待下一行输入。我想编写相同的代码并使其适用于Text
.
但不要只是textInteract
这个用例的特殊情况。interact
我希望它在所有情况下的行为都相同。
haskell - 在 Haskell 中同时读取和写入同一个文件时出错
我需要就地修改文件。所以我打算读取文件内容,处理它们,然后将输出写入同一个文件:
但问题是,只有当我取消注释第 4 行时,它才能按预期工作 - 我只是将字符数输出到控制台。如果我不取消注释,我会得到
有没有办法强制读取该文件?
haskell - Haskell 懒 Bytestring 字不懒?
我有以下 Haskell 程序来计算一串整数的最大和子串:
这个程序的问题在于它将整个文件读入内存。对应的没有BytesString的程序就没有这个问题:
它只使用少量的恒定内存,但当然速度非常慢(大约慢 25 倍)。
该问题仅发生在读取非常大行的程序中。如果输入分布在多条小行上,ByteString 将按预期执行。
有没有办法解决?
lazy-evaluation - hGetContents 是如何实现内存效率的?
我想将 Haskell 添加到我的工具箱中,所以我正在通过Real World Haskell工作。
在输入和输出一章中,hGetContents
我遇到了这个例子:
在此代码示例之后,作者继续说:
请注意,它
hGetContents
为我们处理了所有的阅读。另外,看看processData
。它是一个纯函数,因为它没有副作用,并且每次调用时总是返回相同的结果。在这种情况下,它不需要知道——<em>也没有办法知道——它的输入是从文件中懒惰地读取的。它可以与 20 个字符的文字或磁盘上的 500GB 数据转储完美配合。 (NB重点是我的)
我的问题是:如果没有——在这个例子中—— “能够分辨”,hGetContents
或者它的结果值如何实现这种内存效率,并且仍然保持纯代码(即)产生的所有好处,特别是记忆化?processData
processData
<- hGetContents inh
返回一个字符串,因此inpStr
绑定到 type 的值String
,这正是processData
接受的类型。但是,如果我正确理解 Real World Haskell 的作者,那么这个字符串与其他字符串不太一样,因为它没有完全加载到内存中(或完全评估,如果存在诸如未完全评估的字符串之类的东西...... .) 在调用processData
.
因此,问我的问题的另一种方式是:如果inpStr
在调用时没有完全评估或加载到内存中,那么如何在没有首先完全评估的情况下processData
使用它来查找是否存在记忆调用?processData
inpStr
是否存在String
每个行为不同但在这个抽象级别上无法区分的类型实例?
haskell - Haskell:在惰性 IO 中隐藏故障
这是一个菜鸟问题。
我想写一个函数来提供一个懒惰的图像流,大概是这样的:
不幸的是,读取图像的函数可能会失败,所以它看起来像:
因此,我可以编写的函数如下所示:
如何在保持惰性 IO 的同时实现如下功能?
从语义上讲,当您请求flattenImageStream
下一张图片时,它应该遍历列表并尝试读取每张图片。它会执行此操作,直到找到加载的图像并将其返回。
编辑:答案似乎存在一些分歧。有些人建议使用sequence
. (我会再次测试它以确定何时回到我的电脑。)有人还建议使用unsafeInterleaveIO
. 从该函数的文档来看,它似乎可以工作,但显然我想尽可能地尊重类型系统。
haskell - 防止“getCurrentDirectory:资源耗尽(打开的文件过多)”错误
我正在尝试对Parsec
一大堆小文件运行解析器,并收到一条错误消息,提示我打开的文件太多。我知道我需要使用严格的 IO,但我不知道该怎么做。这是有问题的代码:
注意:我的<<$>>
功能是这样的:
haskell - 读取引用了haskell中其他文件的文件
我正在尝试扩展常规降价,使其能够引用其他文件,以便在“主”文件中的相应位置呈现被引用文件中的内容。
但我来的最远的是实施
ifNExists
只是一个可以忽略的助手,真正的问题发生在句柄的读取中,它只是返回空字符串,我认为这是由于惰性 IO。
我认为使用withFile filepath ReadMode $ \handle -> {-do stutff-}hGetContents handle
将是正确的解决方案,因为我读过fcontent <- withFile filepath ReadMode hGetContents
是一个坏主意。
让我感到困惑的另一件事是功能
奇迹般有效。
那么为什么createF
只返回一个空字符串呢?
整个项目和要测试的目录/文件可以在github上找到
这是数据类型定义
haskell - 如何将延迟流式传输到 foldl' 中?
如何制作自己的流式代码?我正在生成大约 1,000,000,000 对随机的战争套牌,我希望它们能够懒惰地流入 foldl',但我遇到了空间泄漏!这是代码的相关部分:
当我使用 -O2 运行它时,它首先开始冻结我的计算机,然后程序死掉,计算机又恢复了活力(然后谷歌浏览器就有了它需要的资源来对我大喊大叫,因为我用光了它的所有资源。)
注意:我尝试了 unsafeInterleaveIO,但没有成功。
完整代码在: http: //lpaste.net/109977