2017-07-07 4 views
1

J'essaye d'écrire un compilateur Hakyll spécial pour utiliser un script lua pour construire mon site web. J'ai trouvé cette fonction qui coud pour faire ce que je veux:Auteur de pandoc personnalisé avec Hakyll

customWriterCompilerWith :: (WriterOptions -> Pandoc -> IO String) 
         -> ReaderOptions -> WriterOptions 
         -> Compiler (Item String) 
customWriterCompilerWith customWriter ropt wopt = do 
    body <- getResourceBody 
    withItemBody (unsafeCompiler . customWriter wopt) $ readPandocWith ropt body 

Cependant, lorsque je tente de compiler cette fonction, je reçois cette erreur:

• Couldn't match expected type ‘Item Pandoc’ 
       with actual type ‘Compiler (Item Pandoc)’ 
• In the second argument of ‘($)’, namely 
    ‘readPandocWith ropt body’ 

Après une recherche dans la documentation Hakyll, il y a une différence entre le type de readPandocWith dans les versions 4.6.8.0 et 4.9.8.0 (ma version):

readPandocWith:: ReaderOptions-> Item String-> Item Pandoc -- 4.6.8.0 

readPandocWith:: ReaderOptions-> Item String-> Compiler (Item Pandoc) -- 4.9.8.0 

Je n'ai pas trouvé dans le Documentation Hakyll une fonction (dont le type devrait être Compiler (Item Pandoc)-> Item Pandoc) qui pourrait m'aider.

Savez-vous comment résoudre ce problème?

Connaissez-vous une autre façon de créer un compilateur Hakyll personnalisé avec un script LUA?

+1

Il n'y a pas de telle fonction (elle ne peut pas exister); donc ce n'est pas la fonction que vous voulez. La fonction réelle que vous voulez est '>> = compilateur a -> (a -> compilateur b) -> compilateur b'. Ou, puisque vous utilisez déjà la notation 'do',' do {body <- ..; doc <- readPandocWith ropt body; withItemBody (..) doc} '. A part: Je suggérerais de vous familiariser avec les schémas d'abstraction plus basiques qui sont employés par presque toutes les bibliothèques matures de Haskell; Cela vous aidera certainement à naviguer dans l'écosystème Haskell. – user2407038

+1

@ user2407038 Apporte une réponse. – arrowd

Répondre

0

Comme mentionné par @ user2407038, ce qui suit devrait fonctionner:

customWriterCompilerWith customWriter ropt wopt = do 
    body <- getResourceBody 
    doc <- readPandocWith ropt body 
    withItemBody (unsafeCompiler . customWriter wopt) doc 

Pour en savoir plus sur <- (ce qui est le sucre syntaxique pour >>=), je peux recommander http://learnyouahaskell.com (le chapitre monade).

+0

Je n'ai pas lu assez bien la documentation de Hakyll et je n'ai pas vu que 'Compiler' était une monade. Je suis très embarrassé. – JeanJouX