除非我遗漏了什么,似乎只有两种方法可以“遍历” Pandoc
数据结构:
Block
和 Inline
构造函数Walkable
type-class及相关效用函数 使用
Walkable
类型类,是否有一种有效的方法来搜索第一个匹配元素(最好以广度优先的方式),并在找到后立即停止遍历?在我看来,Walkable
周围的所有功能无论如何,type-class 都会遍历整个数据结构。如果没有,我想唯一的方法是模式匹配
Block
和 Inline
构造函数并自行构建。
最佳答案
另一个答案指出了有用的 query
功能。我要补充的是,有一个 package of pandoc lenses .你也问过广度优先遍历,所以这里都有。
import Data.Semigroup (First (..))
dfsFirstLink :: Walkable Inline b => b -> Maybe Text
dfsFirstLink = fmap getFirst . query (preview $ _Link . _2 . _1 . to First)
bfsFirstLink :: Walkable Inline b => b -> Maybe Text
bfsFirstLink = fmap getFirst . getConst . traverseOf (levels query . folded) (Const . preview (_Link . _2 . _1 . to First))
-- Construct a walkable value where dfs != bfs
p :: Pandoc
p = Pandoc mempty [Plain [Note [Plain [Link mempty [] ("a","b")]]],Plain [Link mempty [] ("c","d")]]
>> dfsFirstLink p
Just "a"
>> bfsFirstLink p
Just "c"
尽管不幸的是,一些临时实验表明它可能不像人们希望的那样懒惰。
关于haskell - 在大型 Pandoc 中高效搜索单个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63602164/