Supposons que j'ai un paramètre qui existe uniquement pour le bénéfice du système de type, par exemple comme dans ce petit programme:
{-# LANGUAGE GADTs #-}
module Main where
import Data.Proxy
import Data.List
data MyPoly where
MyConstr :: Proxy a -> a -> (Proxy a -> a -> Int -> Int) -> MyPoly
listOfPolys :: [MyPoly]
listOfPolys = [MyConstr Proxy 5 (const (+))
, MyConstr Proxy 10 (const (+))
, MyConstr Proxy 15 (const (+))]
main = print $ foldl' (\v (MyConstr p n a) -> a p n v) 0 listOfPolys
Les arguments et les membres du proxy dans la structure ne doivent vraiment exister qu'au moment de la compilation pour aider à la vérification de type tout en conservant le polymorphe MyPoly (dans ce cas, le programme se compilera sans lui, mais cet exemple artificiel est un problème plus général où il y a les preuves ou les proxys qui ne sont nécessaires qu'au moment de la compilation) - il n'y a qu'un seul constructeur pour Proxy, et l'argument type est un type fantôme.
La compilation avec ghc avec -ddump-stg
montre qu'au moins au stade STG, il n'y a pas d'effacement de l'argument Proxy au constructeur ou du troisième argument au constructeur.
Existe-t-il un moyen de les marquer comme étant à la compilation uniquement, ou autrement aider ghc à effacer les preuves et à les exclure?
la source