Vous avez besoin d'un tutoriel pour utiliser GHC pour analyser et typer Haskell
Question
Je travaille sur un projet pour l'analyse du code Haskell. J'ai décidé d'utiliser GHC pour analyser la source et en déduire les types plutôt que d'écrire mon propre code pour le faire. En ce moment, je suis obstinés par la documentation Haddock, mais ça va lentement. Est-ce que quelqu'un sait d'un bon tutoriel?
EDIT: Pour clarifier, je ne cherche pas quelque chose comme hlint. J'écris mon propre outil pour analyser les caractéristiques d'exécution de code Haskell, il est donc comme j'écris un autre hlint. Ce que je suis à la recherche est essentiellement une extension de la page wiki GHC En tant que bibliothèque .
La solution
Adam, cela est assez difficile traineaux. Depuis son lancement en 2006, l'API GHC a été quelque peu underdocumented. Ce que je recommande est d'essayer de trouver des petites applications qui ont été écrites en utilisant l'API GHC. Le bon endroit pour demander est probablement le liste de diffusion des utilisateurs GHC.
Un tel programme est ghctags
, qui est livré avec l'arbre source GHC. J'ai écrit la version originale, mais je ne peux pas le recommande-il y a tellement de traces de pas sur le code que je ne peux suivre plus. Le mieux que je peux dire est que bien qu'il soit difficile à suivre, il est au moins petit et difficile à suivre beaucoup plus simple que tous GHC.
Autres conseils
Ah! trouvé un point d'entrée beaucoup mieux dans les docs à: http://www.haskell.org /ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html
Je mis à jour le wikipage avec cet exemple:
Nous démontrons ici appeler parseModule, typecheckModule, desugarModule, getNamesInScope et getModuleGraph. Cela fonctionne pour haskell-plate-forme, GHC-6.12.1.
insectes: libdir est hardcoded. Voir chemins GHC-dessus.
--A.hs
--invoke: ghci -package ghc A.hs
import GHC
import Outputable
--import GHC.Paths ( libdir )
import DynFlags ( defaultDynFlags )
libdir = "/usr/local/lib/ghc-6.12.1"
targetFile = "B.hs"
main = do
res <- example
print $ showSDoc ( ppr res )
example =
defaultErrorHandler defaultDynFlags $ do
runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
target <- guessTarget targetFile Nothing
setTargets [target]
load LoadAllTargets
modSum <- getModSummary $ mkModuleName "B"
p <- parseModule modSum
t <- typecheckModule p
d <- desugarModule t
l <- loadModule d
n <- getNamesInScope
c <- return $ coreModule d
g <- getModuleGraph
mapM showModule g
return $ (parsedSource d,"/n-----/n", typecheckedSource d)
--B.hs
module B where
main = print "Hello, World!"
Si l'analyse syntaxique est la chose la plus importante, je vous recommande haskell-src-exts. Il analyse tous haskell98, un tas d'extensions et est très facile à utiliser.
Le Haskell wiki et hlint , pour vérifier la syntaxe et d'autres choses A propos de votre code source.