Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Text.Parsec.Stream是否有实例流句柄IO Char?_Haskell_Handle_Parsec - Fatal编程技术网

Haskell Text.Parsec.Stream是否有实例流句柄IO Char?

Haskell Text.Parsec.Stream是否有实例流句柄IO Char?,haskell,handle,parsec,Haskell,Handle,Parsec,我正在解析一个相当大的文件,我想定期更新一个进度条,以指示到目前为止我已经解析了多少 我能想到的最直接的方法是使用ParsecT作为IO的monad转换器,这样我就可以取消打印进度条更新,并使用句柄作为流提供程序,这样我就可以使用hFileSize和hTell检查进度 这意味着我需要一个实例流句柄IO Char。我自己使用hGetChar(使用hGetChar)应该不难,但我想我应该看看是否已经有了一个,以处理任何不可预见的问题(比如是否需要插入一些缓冲以提高速度)。一个技巧是提前检查文件的大小

我正在解析一个相当大的文件,我想定期更新一个进度条,以指示到目前为止我已经解析了多少

我能想到的最直接的方法是使用
ParsecT
作为
IO
的monad转换器,这样我就可以取消打印进度条更新,并使用
句柄作为流提供程序,这样我就可以使用
hFileSize
hTell
检查进度


这意味着我需要一个实例
流句柄IO Char
。我自己使用hGetChar(使用
hGetChar
)应该不难,但我想我应该看看是否已经有了一个,以处理任何不可预见的问题(比如是否需要插入一些缓冲以提高速度)。

一个技巧是提前检查文件的大小。然后,在解析的过程中,检查parsec提供的
SourcePos
,查看您已经走了多远。这样做的缺点是,如果您想要跟踪实际的字节数(这样您就可以使用文件系统对文件大小的了解来避免遍历文件两次),那么您必须手动使用重新实现基本解析器。不过,解析器组合器不需要重新实现


或者,您可以遍历文件两次,并使用行计数(在第一次遍历期间计算)来估计您已到达的距离。

另一个不可预见的问题:您是否可以提前查询一次文件大小,并仅使用常用的惰性IO+
流字符串m Char
实例(已为您跟踪
SourcePos
)丹尼尔·瓦格纳:看起来
SourcePos
不跟踪绝对偏移量,只跟踪行/列,所以我必须预先计算行数。你完全可以控制
SourcePos
,所以你可以将绝对偏移量存储在列num中丹尼尔·瓦格纳:是的,但这需要我阻止Parsec在与
\n
匹配时自动重置列计数器。无论如何,我结束并使用SourcePos的
源代码行来显示进度,因此如果您想将建议升级为答案,我将接受。