J'essaie d'utiliser HSlogger pour obtenir des informations sur mon programme. Alors j'ajoute la ligne suivante à ma fonction
import Data.Word
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import Data.Bits
import Data.Int
import Data.ByteString.Parser
import System.Log.Logger
import System.Log.Handler.Syslog
importFile :: FilePath -> IO (Either String (PESFile ))
importFile n = do
warningM "MyApp.Component2" "Something Bad is about to happen."
...
Et cela fonctionne bien, car la fonction est dans IO. Cependant, lorsque j'ajoute une ligne similaire à la fonction suivante:
...
parsePES :: Parser PESFile
parsePES = do
header <- string "#PES"
warningM "parsing header"
...
return (PESFile ...)
Je reçois une erreur de type:
Couldn't match expected type `Parser a0'
with actual type `String -> IO ()'
In the return type of a call of `warningM'
In a stmt of a 'do' expression: warningM "parsing header"
In the expression:
do { header <- string "#PES";
warningM "parsing header";
...
Et je comprends tout à fait pourquoi - ParsePES est dans la monade d’analyse syntaxique, pas dans la monade IO. Ce que je ne comprends pas, c'est quoi faire à ce sujet. Ai-je besoin d'un transformateur monade pour pouvoir empiler la monade parseuse et la monade IO? Comment vais-je à ce sujet?
Disclaimer: Je suis l'auteur du Logger haskell framework .
Bien que la réponse de McCann soit très détaillée, elle ne dit pas que Haskell manquait d'un cadre de journalisation à usage général au moment où la question a été posée. HSLogger est maintenant un standard, mais il fournit une fonctionnalité de journalisation très basique tout en étant lent et non extensible. Pour être clair, voici quelques défauts de HSLogger:
WriterT
ou d'autres solutions pour ne pas gâcher votre code.Cela étant dit, j'aimerais beaucoup présenter le Logger haskell framework . Il permet une journalisation efficace et extensible, notamment:
WriterT
monad)TemplateHaskell
permettant de consigner des détails supplémentaires, tels que les numéros de fichiers ou les noms de modulesBaseLogger
, qui ne peut rien faire de raisonnable. Pour être clair, la fonctionnalité de filtrage est créée en moins de 20 lignes en tant qu’enregistreur-transformateur et vous pouvez définir vos propres transformateurs. Comment le faire est décrit dans la documentation .Mais la bibliothèque est assez nouvelle et peut donc manquer de fonctionnalités. La bonne information est que vous pouvez créer cette fonctionnalité facilement par vous-même ou nous aider à l'améliorer en signalant une demande sur GitHub.
L'enregistreur est développé en interne par l'entreprise où je travaille ( luna-lang.org ) et est utilisé dans un compilateur que nous créons.
Prise sans scrupule: je suis l'auteur de la bibliothèque de journalisation co-log
. Vous pouvez trouver les détails de l'utilisation et de la mise en œuvre de la bibliothèque dans l'article de blog suivant:
L'idée principale derrière cette bibliothèque est de traiter les actions de journalisation comme une simple fonction Haskell. Étant donné que les fonctions sont des citoyens de premier ordre en Haskell et qu’il est extrêmement facile de travailler avec elles.