【问题标题】:Terminate xeno SAX parser early尽早终止 xeno SAX 解析器
【发布时间】:2020-01-13 21:19:41
【问题描述】:

xeno 是一个快速的 XML 解析库。它的 SAX 风格解析函数有以下类型:

process
  :: Monad m
  => (ByteString -> m ()) -- ^ Open tag.
  -> (ByteString -> ByteString -> m ()) -- ^ Tag attribute.
  -> (ByteString -> m ()) -- ^ End open tag.
  -> (ByteString -> m ()) -- ^ Text.
  -> (ByteString -> m ()) -- ^ Close tag.
  -> (ByteString -> m ()) -- ^ CDATA.
  -> ByteString
  -> m ()

是否有m 选项允许在处理程序中提前终止process?提前终止是指process 退出而不处理文档的其余部分,即没有额外的工作。

我知道它可以使用 IO 和异常来完成。是否可以在不使用控制流异常的情况下在 IO 中完成?没有IO也能做到吗?

从上面的类型我们甚至可以确定还是我们还需要知道process的定义?

编辑:

请假设m 需要支持状态,并且该状态需要在短路后可用。

【问题讨论】:

  • 当然可以。不过,解决方案领域有很多不同的选择。完成后您希望获得哪些信息,通常还是通过短路?
  • @Carl 我希望m 存储一些状态并在短路后检索该状态。应该说清楚了吧。如果它使事情变得更简单,假设我想找到具有特定名称的第一个节点,读取它的所有属性值,然后终止并拥有属性的Map ByteString ByteString

标签: xml haskell sax


【解决方案1】:

您可以仅从process 的类型签名中确定,而无需查看其实现:答案是明确的“是的,您可以使其提前终止”。 ExceptT 是规范的提前退出单子变压器系列。使用throwEthrowError 立即终止控制流。

【讨论】:

  • 谢谢!终于想通了。确实,(MonadState ParseState m, MonadError ParseException m) 似乎做得很好,我可以纯粹使用runExceptTrunState 的简单组合来运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 2012-07-16
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
相关资源
最近更新 更多