尽早终止 xeno SAX 解析器

Terminate xeno SAX parser early

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需要支持状态,并且该状态需要在短路后可用。

你可以从 process 的类型签名中确定,而无需看到它的实现:答案是明确的 "yes, you can cause it to terminate early"。 ExceptT is the canonical early-exit monad transformer family. Use throwE or throwError 立即终止控制流。