Припустимо, у мене є параметр, який існує лише на користь системи типів, наприклад, як у цій невеликій програмі:
{-# 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 (у цьому випадку програма буде компілювати без цього, але цей надуманий приклад є більш загальною проблемою, коли є докази чи проксі, які потрібні лише під час компіляції) - для проксі існує лише один конструктор, а аргумент типу - фантомний тип.
Компіляція з ghc з -ddump-stg
показує, що принаймні на етапі STG не відбувається стирання аргументу проксі для конструктора або третього аргументу до конструктора.
Чи є якийсь спосіб відзначити їх як час компіляції або іншим чином допомогти GHC зробити стирання доказів та виключити їх?