haskell - 有没有办法懒惰地 `read`?

标签 haskell

我可能只是徒劳地花了一天的计算时间:)

问题是我(天真地)写了大约 3.5GB 的(压缩的)[(Text, HashMap Text Int)]数据到一个文件,那时我的程序崩溃了。当然没有最终的]在数据的末尾,它的庞大规模使得手动编辑它是不可能的。

数据通过 Prelude.show 格式化就在这一点上,我意识到 Prelude.read在返回任何数据之前,需要将整个数据集放入内存(不可能)。

现在......有没有办法恢复数据而无需手动编写解析器?

更新 1

main = do
  s <- getContents
  let hs = read s :: [(String, M.Map String Integer)]
  print $ head hs

我试过这个......但它只是不断消耗更多的内存,直到它被操作系统杀死。

最佳答案

有点。您仍将手动编写解析器……但它是一个非常短且非常易于编写的解析器,因为几乎所有的解析器都会发送到 read。 .想法是这样的:read是严格的,但是 reads ,在处理单个元素时,是懒惰的。所以我们只需要去掉 reads 的位。在处理单个元素时不期望。这是一个帮助您入门的示例:

> let s = "[3,4,5," ++ undefined
> reads (drop 1 s) :: [(Int, String)]
[(3,",4,5,*** Exception: Prelude.undefined

我包括了undefined最后作为证据表明它实际上没有阅读整个String在生成解析后的 3 之前在列表的顶部。

关于haskell - 有没有办法懒惰地 `read`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24558786/

相关文章:

haskell - 实例声明中的 "Illegal polymorphic or qualified type"(System-F 样式树)

haskell - 加载文件时 WinGHCi 总是抛出异常

haskell - 我是否应该为可能适合该接口(interface)的类型实例化 Num 类型类?

haskell - 99 个 Haskell 问题中的 26 个 - 为什么结果包含多个具有相同头的列表?

haskell - 获取 Wadler 关于 Haskell 的讲座和 Material

haskell - 获取嵌套列表的头和尾

python - Haskell 的惰性是 Python 生成器的优雅替代品吗?

haskell - ProjectEuler Q2 : Haskell solution won't evaluate

string - Data.Text 的好处

sql - 在Haskell中进行部分SQL插入