สมมติว่าฉันมีพารามิเตอร์ที่มีอยู่เพื่อประโยชน์ของระบบประเภทตัวอย่างเช่นในโปรแกรมขนาดเล็กนี้:
{-# 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
อาร์กิวเมนต์ Proxy และสมาชิกในโครงสร้างจำเป็นต้องมีอยู่จริงในเวลาคอมไพล์เพื่อช่วยในการตรวจสอบชนิดในขณะที่รักษา polymorphic MyPoly (ในกรณีนี้โปรแกรมจะคอมไพล์โดยไม่มีมัน แต่ตัวอย่างที่ถูกประดิษฐ์นี้เป็นปัญหาทั่วไปที่มี หลักฐานหรือพร็อกซี่ที่จำเป็นต้องใช้ในเวลารวบรวมเท่านั้น) - มีคอนสตรัคเตอร์เดียวเท่านั้นสำหรับพร็อกซีและอาร์กิวเมนต์ประเภทคือประเภทผี
รวบรวมด้วย ghc ด้วย -ddump-stg
แสดงให้เห็นว่าอย่างน้อยที่สุดในสเตจ STG ไม่มีการลบอาร์กิวเมนต์ของพร็อกซีไปยังตัวสร้างหรืออาร์กิวเมนต์ที่สามของตัวสร้าง
มีวิธีใดที่จะทำเครื่องหมายสิ่งเหล่านี้ว่าเป็นการรวบรวมเวลาเท่านั้นหรือช่วยให้ ghc ทำการพิสูจน์การลบและยกเว้นพวกมันได้หรือไม่?