Suponha que eu tenha um parâmetro que exista apenas para o benefício do sistema de tipos, por exemplo, como neste pequeno 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
Os argumentos e membros do Proxy na estrutura realmente precisam existir no momento da compilação para ajudar na verificação de tipo enquanto mantêm o MyPoly polimórfico (nesse caso, o programa será compilado sem ele, mas este exemplo artificial é um problema mais geral em que existem provas ou proxies necessários apenas em tempo de compilação) - existe apenas um construtor para Proxy, e o argumento type é um tipo fantasma.
Compilar com ghc with -ddump-stg
mostra que, pelo menos no estágio STG, não há apagamento do argumento Proxy para o construtor ou o terceiro argumento para o construtor.
Existe alguma maneira de marcá-las como sendo apenas em tempo de compilação ou de outra forma ajudar o ghc a apagar provas e excluí-las?
fonte