Développer en Haskell avec ghcup et vscode, en 2022

Voir aussi : video youtube

Haskell est un langage de programmation issu d’une spécification débutée dans les années 1990. Depuis le temps, cette spécifications a donné lieu à différentes implémentations ainsi qu’à de nombreux outils connexes.

Ici, on va voir comment installer/utiliser ghcup et vscode sur linux, pour développer en Haskell, en 2022.

Aperçu

Pour développer dans un langage de programmation, on a principalement besoin d’un compilateur et d’un éditeur de code. Actuellement, le combo ghcup + vscode est assez populaire et facile à mettre en place mais il existe d’autres alternatives également intéressantes :

Compilateur

Le compilateur est l’outil indispensable pour générer le code exécutable, utilisable par l’utilisateur final. Comme Haskell est, à l’origine, une spécification, il n’y a pas de compilateur officiel et différentes implémentations ont été réalisées (ghc, hugs, nhc…).

Depuis quelques années, GHC est le compilateur de référence. L’outil ghcup permet, de plus, d’installer et de gérer différentes versions de GHC et de quelques outils associés.

Gestion de projet

Un projet Haskell peut comporter différents modules, organisés en bibliothèques, exécutables, tests… Il existe principalement deux outils pour gérer un projet : cabal et stack.

Le choix de l’un ou de l’autre se fera probablement selon le mode de gestion des dépendances voulu (cf section suivante), sachant qu’on a une certaine compatibilité entre ces deux outils (stack peut utiliser le fichier de configuration cabal).

Gestion de dépendance

Haskell a un dépôt communautaire de bibliothèques (hackage). Les outils cabal et stack permettent d’inclure ces bibliothèques dans un projet. La différence tient principalement dans la gestion de versions : cabal utilise un système de contraintes pour récupérer les bibliothèques à des versions compatibles, stack utilise un système de snapshots (c’est-à-dire un ensemble de versions bien précises, qui ont été testées ensemble).

Nix est un outil qui permet de gérer des environnements logiciels de façon plus générale. Il est compatible avec cabal et avec stack et peut être intéressant pour intégrer des dépendances non-Haskell, configurer le déploiement…

Éditeurs de code

Actuellement, Visual Code est un éditeur populaire et accessible, qui permet de développer du code en Haskell (via des plug-ins comme haskell.haskell ou Simple GHC).

Les classiques Vim et Emacs ont également tout ce qu’il faut pour développer en Haskell.

Aide au développement

Enfin, il existe toute sorte d’outils d’aide au développement. Par exemple : haskell-language-server (complétion, rapport d’erreurs…), hlint (linter), ormolu (formatter)…

Dans la suite de cet article, on considèrera les outils 
ghcup, ghc, cabal, vscode (+ haskell.haskell), 
le tout sous Linux.

Installation

Sous Linux, la procédure est relativement simple et se résume à :

On notera cependant que haskell-language-server est configuré pour du multi-coeur (donc penser à mettre plusieurs cpu virtuels en cas de test en VM).

Enfin, il peut être nécessaire de choisir des versions compatibles entre les différents outils (par exemple : ghc 9.0.2 + hls 1.8.0.0).

Utilisation

Ghcup

Ghcup est l’équivalent pour Haskell de rustup pour Rust. Il permet d’installer les différents outils (ghc, cabal, stack, hls) et de sélectionner les versions voulues.

Ghcup propose une interface en ligne de commande mais également une interface basée-texte, qu’on peut lancer avec la commande :

ghcup tui

On peut ensuite naviguer sur les versions proposées et les installer (touche i) ou les sélectionner (touche s) :

GHC

Ghc est le compilateur de base, utilisable via la commande ghc. On notera que ghc propose également la commande runghc, qui permet d’exécuter un code source directement (compilation à la volée), ainsi que la commande ghci, qui permet d’évaluer du code interactivement (selon le principe du Read–eval–print loop) :

Cabal

Cabal permet de gérer un projet Haskell et ses dépendances sur hackage. On peut initialiser un projet, dans le dossier courant, avec la commande :

cabal init --interactive

La configuration du projet se fait alors via le fichier .cabal. Le programme cabal permet ensuite de compiler (build), lancer un exécutable (run), lancer les tests (test)…

Visual Code

Vscode est un éditeur de code. On peut donc ouvrir le dossier d’un projet Haskell et vscode offrira toute sorte de fonctionnalités adaptées :

Avec hls et le plug-in haskell.haskell, on a notamment de la complétion et de la navigation de code :

Ainsi qu’une aide au refactoring :

Ou encore, un affichage des type-holes :

Enfin, une fonctionnalité intéressante est le “inline repl”, qui consiste à écrire le marqueur -- >>> suivi d’une expression Haskell. Vscode affichera alors un bouton permettant d’évaluer cette expression et de recopier l’affichage résultat en commentaire.