【发布时间】:2020-07-03 09:49:05
【问题描述】:
假设我有一个仅为类型系统的利益而存在的参数,例如在这个小程序中:
{-# 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 进行证明擦除并排除它们?
【问题讨论】:
标签: haskell phantom-types