Parfois, un morceau de code que je veux écrire n'est pas légal sans au moins une extension de langage. C'est particulièrement vrai quand on essaie d'implémenter des idées dans des articles de recherche, qui ont tendance à utiliser n'importe quelle version super étendue de GHC disponible au moment où l'article a été écrit, sans préciser quelles extensions sont réellement nécessaires.
Le résultat est que je me retrouve souvent avec quelque chose comme ceci en haut de mes fichiers .hs :
{-# LANGUAGE TypeFamilies
, MultiParamTypeClasses
, FunctionalDependencies
, FlexibleContexts
, FlexibleInstances
, UndecidableInstances
, OverlappingInstances #-}
Cela ne me dérange pas, mais j'ai souvent l'impression de faire des sacrifices aveugles pour apaiser le Grand Dieu de GHC. Il se plaint qu'un certain morceau de code n'est pas valide sans l'extension de langage X, alors j'ajoute un pragma pour X. Puis il demande que j'active Y, alors j'ajoute un pragma pour Y. Au moment où cela se termine, j'ai activé trois ou quatre extensions de langage que je ne comprends pas vraiment, et je n'ai aucune idée de celles qui sont "sûres".
Pour expliquer ce que j'entends par "sûr" :
-
Je comprends que
UndecidableInstances
est sûre, car même si elle peut empêcher le compilateur de terminer, tant que le code est compilé, elle n'aura pas d'effets secondaires inattendus. -
D'un autre côté,
OverlappingInstances
est clairement dangereux, car il est très facile pour moi d'écrire accidentellement du code qui donne des erreurs d'exécution.
Donc ma question est :
Existe-t-il une liste des extensions GHC qui sont considérées comme "sûres" et "non sûres" ?