2016-10-13 3 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 и доступен только экземпляр таким образом

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 
+0

Спасибо, ваше объяснение очень ясное. Я неправильно предполагал, что «Meta -> Meta» будет соответствовать «a -> a». –

+0

@ RichardParsons Я не думаю, что это предположение было неверным, и я думаю, что этот ответ явно говорит, что предположение верно; почему вы считаете это неправильным? –

+0

@ DanielWagner Я изо всех сил пытаюсь исправить терминологию Haskell, но я сделаю все возможное. Я мог видеть, что функция toJSONFilter требует аргументов (a -> a). Поскольку моя функция имеет подпись Meta -> Meta, а Meta - от Pandoc, я решил, что JSONFilter будет работать над ней. На самом деле, нет экземпляра «Walkable Meta Pandoc», и поэтому он не прошел. Ответ Майкла объяснил, что, поскольку есть экземпляр «Walkable Pandoc Pandoc», я мог бы изменить свою функцию, чтобы использовать эту подпись вместо Meta -> Meta. Насколько яснее сейчас? –

 Смежные вопросы

  • Нет связанных вопросов^_^