这个一元解析器会导致空间泄漏吗?



我正在阅读箭头教程。https://en.wikibooks.org/wiki/Haskell/Understanding_arrows Avoiding_leaks。读这部分我有点困惑

solfege :: Parser Char String
solfege = string "Do" <|> string "Re" <|> string "Mi"

通过最后这个例子,我们可以指出swerstra和Duponcheel试图解决的问题。当solfege在字符串"Fa&quot上运行时,我们无法检测解析器是否会失败,直到所有三个备选方案都失败。如果我们有更复杂的解析器,其中一个替代方案可能在尝试消耗大量输入流后才失败,我们将不得不以同样的方式下降解析器链。所有可能被以后的解析器使用的输入都必须保留在内存中,以防其中一个解析器碰巧能够使用它。这可能会导致比您天真地预期更多的空间使用-这种情况通常被称为空间泄漏。

我不明白solfege有造成空间泄漏的风险。solfege(string "Do",string "Re"string "Mi")中的每个选项在与"Fa"的第一个字符'F'比较时都失败了。如果这些替代方案消耗多个字符并失败,那么我可以接受solfege导致空间泄漏。然而,这只有在string的实现是愚蠢的时候才有可能。此外,我很难想象一元解析器会在使用不必要的令牌后失败,除非它是故意写得很糟糕。

我在文章中错过了什么吗?

您可能忽略的关键部分是这一点:

如果我们有更复杂的解析器,其中一个替代方案可能只有在尝试消耗大量输入流后才会失败,…

所以,string "Do"不是字面上的意思,而是作为一个解析器的代表,它做更多的工作,可能必须在输入中任意地提前查看,以知道它是否应该失败。

最新更新