过滤以向pandoc添加元数据

时间:2016-10-13 07:07:20

标签: haskell pandoc

我正在尝试编写一个过滤器,为pandoc添加一些新的元数据。

到目前为止,这是我的代码:

#!/usr/bin/runhaskell

import Data.Map
import Text.Pandoc
import Text.Pandoc.JSON
import Text.Pandoc.Walk

addName :: Meta -> Meta
addName m = Meta $ insert "Name" (MetaString "My Name") (unMeta m)

main :: IO ()
main = toJSONFilter addName

我收到以下错误:

add-meta.hs:12:8: error:
    • No instance for (Walkable Meta Pandoc)
        arising from a use of ‘toJSONFilter’
    • In the expression: toJSONFilter addName
      In an equation for ‘main’: main = toJSONFilter addName
Failed, modules loaded: none.

如何更改此设置以使其正确构建?

1 个答案:

答案 0 :(得分:4)

我认为消息的扩展是编译器可以看到

addName :: Meta -> Meta

a -> a的示例,因此只有可用的实例

instance Walkable a Pandoc => ToJSONFilter (a -> a)

Meta放到a,它需要在某处找到预先设定的instance Walkable Meta Pandoc,但不是。

解决方案很简单:我们确实拥有Walkable Pandoc Pandoc,因此我们可以改为进行Pandoc -> Pandoc转换。无论如何,这是toJSONFilter最直观的输入:

addName :: Pandoc -> Pandoc 
addName (Pandoc m ls) = Pandoc m' ls where
  m' = Meta (insert "Name" (MetaString "My Name") (unMeta m))

main :: IO ()
main = toJSONFilter addName