Exemples avec le package Haskell-src-exts

Oct 24 2020

Je travaille avec Haskell et je souhaite créer un vérificateur de type pour cette langue. Pour ce faire, j'ai besoin d'un moyen de l'analyser et je sais que Haskell-src-exts convient bien au travail. Cependant, je n'ai pas la moindre idée du fonctionnement de ce package; J'ai essayé de trouver des exemples / tutoriels sur Internet sans aucun résultat. Quelqu'un peut-il m'aider? Est-ce que quelqu'un connaît un tutoriel, ou peut-être peut-il me référencer un livre qui contient des exemples sur ce package? Je suis également ouvert pour essayer un autre package, s'il est bien décrit et qu'il est livré avec une multitude d'exemples.

Réponses

2 K.A.Buhr Oct 23 2020 at 23:16

Un point d'entrée pratique est parseFile. Si le programme suivant est utilisé pour s'analyser:

module HelloParser where

import Language.Haskell.Exts

main = print =<< parseFile "HelloParser.hs"

puis il produit la sortie analysée (débarrassée des SrcSpanInfovaleurs et reformatée):

ParseOk
  (Module (Just (ModuleHead (ModuleName "HelloParser") Nothing Nothing)) []
    [ ImportDecl { importModule = ModuleName "Language.Haskell.Exts"
                 , importQualified = False
                 , importSrc = False
                 , importSafe = False
                 , importPkg = Nothing
                 , importAs = Nothing
                 , importSpecs = Nothing} ]
    [ PatBind
      (PVar (Ident "main"))
      (UnGuardedRhs (InfixApp
                      (Var (UnQual (Ident "print")))
                      (QVarOp (UnQual (Symbol "=<<")))
                      (App
                        (Var (UnQual (Ident "parseFile")))
                        (Lit (String "HelloParser.hs" "HelloParser.hs")))))
      Nothing ])

qui semble relativement lisible.

Pour terminer la tâche de vérification de type Haskell, je ne pense pas qu'il existe un moyen d'éviter de considérer individuellement les centaines de types de données et de constructeurs d'arborescence d'analyse dans Language.Haskell.Exts.Syntaxet les autres modules de package, donc je ne suis pas sûr de combien -Un tutoriel en profondeur peut vous aider.