2016-10-13 21 views
3

私はいくつかの新しいメタデータを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. 

は、どのように私はこれを変更することができますか?

答えて

4

私はメッセージのexpanationは、コンパイラが

addName :: Meta -> Meta 

a -> aの一例であり、唯一の使用可能なインスタンスは、このように

aため Meta、それを置く
instance Walkable a Pandoc => ToJSONFilter (a -> 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 
+0

ありがとう、あなたの説明は非常に明確です。私は間違って "Meta - > Meta"が "a - > a"と一致すると仮定していました。 –

+0

@リチャードパーソン私は仮定が間違っているとは思わないし、私はこの答えが明示的には仮定が正しいと言っていると思う。なぜそれが間違っていると思いますか? –

+0

@DanielWagner私はHaskellの用語を正しいものにするのに苦労しますが、私は最善を尽くします。関数toJSONFilterが引数を必要としていることがわかりました(a - > a)。私の機能にはMeta→Metaという署名があり、MetaはPandocからのものですから、私はJSONFilterにそれが作用すると考えました。実際には、「Walkable Meta Pandoc」というインスタンスは存在しないため、失敗しました。マイケルの答えは、 "Walkable Pandoc Pandoc"のインスタンスがあるので、Meta - > Metaの代わりにそのシグネチャを使用するように自分の関数を変更できると説明しました。 これではっきりしていますか? –

関連する問題