gpt4 book ai didi

haskell - 自定义流类型如何影响位置信息。秒差距?

转载 作者:行者123 更新时间:2023-12-02 12:08:22 26 4
gpt4 key购买 nike

我将 Parsec 与自定义 Stream 类型结合使用。该流本质上是String,但有时它将在字符串中找到的输入扩展为其他字符串(想想别名扩展)。例如,给定“§4.1 ¶3”,它可能会将“Section 4.1 paragraph 3”提供给解析器。

我已经完成了这一切。我的类型如下所示:

data DealiasingStream = ...
instance (Monad m) => Stream DealiasingStream m Char where ...

type ShellParser = Parsec DealiasingStream ()

请注意,DealiasingStream 的依赖类型只是 Char。这允许我的解析器(嗯,我的 ShellParser 可以使用所有标准字符解析器。

我的问题是如何让秒差距根据流中的原始输入报告位置。 Stream 的文档说:

A Stream instance is responsible for maintaining the "position within the stream" in the stream state s. This is trivial unless you are using the monad in a non-trivial way.

事实上,我的流类型知道它在任何给定时刻想要报告的位置......但我不知道如何让秒差距使用它! Parsec 似乎维护自己的 SourcePos 作为其内部 State 的一部分。这似乎是由各种 token prims 更新的,因此对于标准 Char 解析器来说,这是我无法控制的。

应该如何做到这一点?

最佳答案

我同意你的理解——如果不重写char等函数,就没有简单的方法来控制位置。

文档的意思是,Stream 实例负责记录 token 内的位置信息。然后,该信息可以在 tokentokenPrim 等函数中使用(通过向它们提供适当的位置计算函数)。

因此,您必须将 Char 包装为包含位置信息的数据类型,并使用 tokentokenPrim 等原语重写基本函数位置计算灵活。

关于haskell - 自定义流类型如何影响位置信息。秒差距?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com