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的源代码行来显示进度,因此如果您想将建议升级为答案,我将接受。