假设我有一个仅出于类型系统的利益而存在的参数,例如在此小程序中:
{-# 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
结构中的Proxy参数和成员只需要在编译时就存在,以在维护多态MyPoly的同时帮助类型检查(在这种情况下,程序将在没有它的情况下进行编译,但是这个人为设计的示例是一个更普遍的问题,证明或仅在编译时需要的代理)-代理只有一个构造函数,并且type参数是幻像类型。
使用ghc with进行编译-ddump-stg
表明,至少在STG阶段,不会删除构造函数的Proxy参数或构造函数的第三个参数。
有什么方法可以将它们标记为仅编译时,或者以其他方式帮助ghc进行证明擦除并将其排除在外?