Giả sử tôi có một tham số chỉ tồn tại vì lợi ích của hệ thống loại, ví dụ như trong chương trình nhỏ này:
{-# 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
Các đối số Proxy và các thành viên trong cấu trúc chỉ thực sự cần tồn tại vào thời gian biên dịch để giúp kiểm tra kiểu trong khi duy trì MyPoly đa hình (trong trường hợp này, chương trình sẽ biên dịch mà không có nó, nhưng ví dụ giả định này là một vấn đề chung hơn khi có bằng chứng hoặc proxy chỉ cần thiết trong thời gian biên dịch) - chỉ có một hàm tạo cho Proxy và đối số loại là loại ảo.
Biên dịch với ghc với các -ddump-stg
chương trình ít nhất là ở giai đoạn STG, không có sự xóa bỏ đối số Proxy đối với hàm tạo hoặc đối số thứ ba đối với hàm tạo.
Có cách nào để đánh dấu những thứ này chỉ là thời gian biên dịch, hay nói cách khác là giúp ghc thực hiện việc xóa bằng chứng và loại trừ chúng?