Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 用于将元数据添加到pandoc的筛选器_Haskell_Pandoc - Fatal编程技术网

Haskell 用于将元数据添加到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 :

我正在尝试编写一个过滤器,将一些新的元数据添加到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.

我如何修改它以使其正确构建?

我认为对消息的解释是编译器可以看到这一点

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好的,我很高兴!看来我只是误解了你,而你自己也很了解事情。很高兴发现这一点。