假设我有一个参数,仅为了类型系统的好处而存在,例如在这个小程序中:
{-# 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 只有一个构造函数,类型参数是一个虚拟类型。
使用 -ddump-stg
编译 ghc 显示,在 STG 阶段至少不会对构造函数的 Proxy 参数或第三个参数进行消除。
是否有任何方法可以将它们标记为仅在编译时使用,或者以其他方式帮助 ghc 进行证明擦除并将它们排除?