Misalkan saya memiliki parameter yang hanya ada untuk kepentingan sistem tipe, misalnya seperti dalam program kecil ini:
{-# 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
Argumen Proxy dan anggota dalam struktur hanya benar-benar perlu ada pada waktu kompilasi untuk membantu memeriksa jenis sambil mempertahankan polimorfik MyPoly (dalam hal ini, program akan dikompilasi tanpa itu, tetapi contoh yang dibuat ini adalah masalah yang lebih umum di mana ada bukti atau proksi yang hanya diperlukan pada waktu kompilasi) - hanya ada satu konstruktor untuk Proksi, dan argumen tipe adalah tipe hantu.
Kompilasi dengan ghc dengan -ddump-stg
menunjukkan bahwa setidaknya pada tahap STG, tidak ada penghapusan argumen Proxy ke konstruktor atau argumen ketiga ke konstruktor.
Apakah ada cara untuk menandai ini sebagai waktu kompilasi saja, atau sebaliknya membantu ghc untuk melakukan penghapusan bukti dan mengecualikannya?
sumber