たとえば、次の小さなプログラムのように、型システムのメリットのためだけに存在するパラメーターがあるとします。
{-# 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
構造のプロキシ引数とメンバーは、多形性MyPolyを維持しながら型チェックを支援するためにコンパイル時に存在する必要があるだけです(この場合、プログラムはそれなしでコンパイルされますが、この不自然な例は、より一般的な問題です)コンパイル時にのみ必要な証明またはプロキシ)-Proxyのコンストラクタは1つだけで、type引数はファントムタイプです。
ghcを使用し-ddump-stg
てコンパイルすると、少なくともSTGの段階では、コンストラクターへのProxy引数またはコンストラクターへの3番目の引数は消去されません。
これらをコンパイル時のみとしてマークする方法、またはghcが証拠消去を実行してそれらを除外するのを助ける方法はありますか?