Supongamos que tengo un parámetro que existe solo para el beneficio del sistema de tipos, por ejemplo, como en este pequeño programa:
{-# 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
Los argumentos y miembros de Proxy en la estructura solo necesitan existir en tiempo de compilación para ayudar con la verificación de tipos mientras se mantiene el MyPoly polimórfico (en este caso, el programa se compilará sin él, pero este ejemplo artificial es un problema más general donde hay pruebas o proxies que solo se necesitan en tiempo de compilación): solo hay un constructor para Proxy, y el argumento type es un tipo fantasma.
Compilar con ghc con -ddump-stg
muestra que, al menos en la etapa STG, no hay borrado del argumento Proxy para el constructor o el tercer argumento para el constructor.
¿Hay alguna manera de marcarlos como solo en tiempo de compilación, o de lo contrario ayudar a ghc a borrar la prueba y excluirlos?
fuente