Supponiamo che io abbia un parametro che esiste solo a beneficio del sistema di tipi, ad esempio come in questo piccolo programma:
{-# 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
Gli argomenti proxy e i membri nella struttura devono davvero esistere solo al momento della compilazione per aiutare con il controllo del tipo mantenendo il polimero MyPoly (in questo caso, il programma verrà compilato senza di esso, ma questo esempio inventato è un problema più generale in cui ci sono prove o proxy che sono necessari solo al momento della compilazione) - esiste solo un costruttore per Proxy e l'argomento type è un tipo fantasma.
Compilare con ghc con -ddump-stg
mostra che almeno nella fase STG, non c'è cancellazione dell'argomento Proxy per il costruttore o del terzo argomento per il costruttore.
Esiste un modo per contrassegnarli come solo in fase di compilazione, o altrimenti aiutare Ghc a fare la cancellazione della prova ed escluderli?