Załóżmy, że mam parametr, który istnieje tylko na korzyść systemu typów, na przykład jak w tym małym programie:
{-# 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
Argumenty i elementy proxy w strukturze muszą naprawdę istnieć tylko w czasie kompilacji, aby pomóc w sprawdzaniu typu przy zachowaniu polimorficznej MyPoly (w tym przypadku program skompiluje się bez niego, ale ten wymyślony przykład jest bardziej ogólnym problemem, w którym występują proofy lub proxy, które są potrzebne tylko w czasie kompilacji) - dla Proxy istnieje tylko jeden konstruktor, a argumentem typu jest typ fantomowy.
Kompilacja z ghc z -ddump-stg
pokazuje, że przynajmniej na etapie STG nie ma usunięcia argumentu Proxy dla konstruktora ani trzeciego argumentu dla konstruktora.
Czy jest jakiś sposób, aby oznaczyć je jako czas kompilacji, lub w inny sposób pomóc ghc w skasowaniu dowodu i wykluczyć je?
źródło