Haskell 用于将元数据添加到pandoc的筛选器
我正在尝试编写一个过滤器,将一些新的元数据添加到pandoc中 这是我目前的代码:Haskell 用于将元数据添加到pandoc的筛选器,haskell,pandoc,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 :
#!/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.
我如何修改它以使其正确构建?我认为对消息的解释是编译器可以看到这一点
addName :: Meta -> Meta
是a->a
的一个示例,因此只有该实例可用
instance Walkable a Pandoc => ToJSONFilter (a -> a)
将Meta
放在a
中,它需要在某个地方找到预设的实例可行走的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
谢谢,你的解释很清楚。我错误地假设“Meta->Meta”与“a->a”匹配。@RichardParsons我不认为这个假设是错误的,我认为这个答案明确地说明了这个假设是正确的;“为什么你认为这是不正确的?”丹尼尔瓦格纳我努力使哈斯克尔术语正确,但我会尽我所能。我可以看到函数toJSONFilter需要参数(a->a)。因为我的函数有Meta->Meta的签名,Meta来自Pandoc,所以我想toJSONFilter可以处理它。事实上,并没有“可行走的Meta Pandoc”实例,所以它失败了。Michael的回答解释说,既然有一个“Walkable Pandoc Pandoc”的实例,我可以修改我的函数,使用该签名,而不是Meta->Meta。现在清楚了吗?@RichardParsons好的,我很高兴!看来我只是误解了你,而你自己也很了解事情。很高兴发现这一点。