Angenommen, ich habe einen Parameter, der nur zum Nutzen des Typsystems existiert, zum Beispiel wie in diesem kleinen Programm:
{-# 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
Die Proxy-Argumente und -Mitglieder in der Struktur müssen nur zur Kompilierungszeit vorhanden sein, um bei der Typprüfung zu helfen, während das polymorphe MyPoly beibehalten wird (in diesem Fall wird das Programm ohne es kompiliert, aber dieses erfundene Beispiel ist ein allgemeineres Problem, wenn es solche gibt Proofs oder Proxys, die nur zur Kompilierungszeit benötigt werden) - Es gibt nur einen Konstruktor für Proxy, und das Argument type ist ein Phantomtyp.
Das Kompilieren mit ghc mit -ddump-stg
zeigt, dass zumindest in der STG-Phase das Proxy-Argument für den Konstruktor oder das dritte Argument für den Konstruktor nicht gelöscht wird .
Gibt es eine Möglichkeit, diese als nur zur Kompilierungszeit zu markieren oder auf andere Weise ghc dabei zu helfen, das Löschen von Beweisen durchzuführen und sie auszuschließen?
quelle