haskell - 在大型 Pandoc 中高效搜索单个元素

标签 haskell pandoc

除非我遗漏了什么,似乎只有两种方法可以“遍历” Pandoc数据结构:

  • 手动模式匹配 BlockInline构造函数
  • 通过 Walkable type-class及相关效用函数

  • 使用 Walkable类型类,是否有一种有效的方法来搜索第一个匹配元素(最好以广度优先的方式),并在找到后立即停止遍历?在我看来,Walkable 周围的所有功能无论如何,type-class 都会遍历整个数据结构。
    如果没有,我想唯一的方法是模式匹配 BlockInline构造函数并自行构建。

    最佳答案

    另一个答案指出了有用的 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/

    相关文章:

    python - 通过 Panflute 的 Pandoc 过滤器未按预期工作

    pdf - Pandoc Markdown 到 PDF

    r - 如何使用 R markdown 和 pandoc 防止在 LaTeX 文档中转义〜(波浪号)字符?

    scala - 从哪里开始依赖类型编程?

    r - 在 R markdown beamer 演示文稿中添加作者隶属关系

    javascript - Fay、渲染循环和鼠标事件

    list - 递归地将元组列表转换为列表元组

    r - 更改rmarkdown中单行的字体大小而不改变全局字体大小

    haskell - 如何在haskell中调用函数并返回不同的值? (无单子(monad))

    haskell - 在计算嵌套深度的方法中使用可重叠的捕获所有实例是否安全?