尽早终止 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
立即终止控制流。
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
立即终止控制流。