web-dev-qa-db-fra.com

Comment puis-je me connecter à Haskell?

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?

42
nont

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:

  1. C'est lent. Par lenteur, je veux dire que chaque fois que vous enregistrez un message, il analyse (de manière très simple) une chaîne décrivant l’origine du journal et utilise des types de données existentiels sous le capot, qui doivent introduire une surcharge de performances au moment de l’exécution.
  2. Il ne permet pas de se connecter à d'autres monades que IO, vous devez donc utiliser WriterT ou d'autres solutions pour ne pas gâcher votre code.
  3. Il n'est pas extensible - vous ne pouvez pas créer vos propres niveaux de priorité, définir des comportements personnalisés (comme la journalisation inter-thread) ou le filtrage des journaux de temps de compilation.
  4. Il ne fournit pas certaines informations, telles que les numéros de ligne ou les noms de fichiers où les journaux ont été placés. Et bien sûr, il est très difficile de l'étendre pour prendre en charge de telles informations.

Cela étant dit, j'aimerais beaucoup présenter le Logger haskell framework . Il permet une journalisation efficace et extensible, notamment:

  1. connexion en code pur séquentiel (en utilisant aussi bien WriterT monad)
  2. filtrage avancé des messages (y compris le filtrage à la compilation)
  3. capacité de journalisation inter-thread
  4. fournit une interface TemplateHaskell permettant de consigner des détails supplémentaires, tels que les numéros de fichiers ou les noms de modules
  5. est très facilement extensible - toutes les fonctionnalités sont créées en tant qu’extensions d’une simple BaseLogger, 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 .
  6. Fournit une sortie colorée sur toutes les plateformes par défaut.

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.

24
Wojciech Danilo

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.

0
Shersh