예를 들어이 작은 프로그램에서와 같이 유형 시스템의 이점을 위해 존재하는 매개 변수가 있다고 가정합니다.
{-# 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를 유지하면서 유형 검사를 돕기 위해 컴파일 타임에 실제로 존재해야합니다 (이 경우 프로그램은 컴파일하지 않고 컴파일되지만이 고안된 예는 더 일반적인 문제입니다) (컴파일시에만 필요한 증명 또는 프록시)-프록시에는 생성자가 하나 뿐이며 type 인수는 팬텀 유형입니다.
ghc를 사용하여 컴파일하면 -ddump-stg
적어도 STG 단계에서 생성자에 대한 프록시 인수 나 생성자에 대한 세 번째 인수가 지워지지 않습니다.
이것을 컴파일 타임으로 표시하거나 ghc가 증거 삭제를 수행하고 제외하도록 돕는 방법이 있습니까?