Örneğin, bu küçük programda olduğu gibi yalnızca tür sisteminin faydası için var olan bir parametreniz olduğunu varsayalım:
{-# 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 argümanları ve yapıdaki üyelerin, polimorfik MyPoly'yi korurken tip kontrolüne yardımcı olmak için sadece derleme zamanında var olmaları gerekir (bu durumda, program onsuz derlenecektir, ancak bu çelişkili örnek, daha genel bir problemdir. yalnızca derleme zamanında gerekli olan provalar veya proxy'ler) - Proxy için yalnızca bir kurucu vardır ve tür argümanı hayali bir türdür.
Ghc ile derleme -ddump-stg
, en azından STG aşamasında, kurucuya Proxy argümanının veya kurucuya üçüncü argümanın silinmediğini gösterir.
Bunları yalnızca derleme zamanı olarak işaretlemenin ya da ghc'ye kanıt silme ve hariç tutma konusunda yardımcı olmanın herhangi bir yolu var mı?