比方說,我有提升的數據類型:消除圖案GADT匹配時構造靜態已知
data GADTConstructor = IntConstructor | StringConstructor
然後,我創建GADT:
data MyGADT (a :: GADTConstructor) where
MyInt :: Int -> MyGADT IntConstructor
MyString :: String -> MyGADT StringConstructor
和模式匹配功能:
printMyMyGADT :: MyGADT a -> IO()
printMyMyGADT (MyInt i) = printInteger i
printMyMyGADT (MyString s) = printString s
這裏實際的GADT的構造函數由編譯時已知的GADT類型索引唯一確定。是否有可能強制GHC在運行時忽略任何模式匹配,並假設實際分支靜態已知,生成代碼?
我相當肯定GHC在沒有幫助的情況下無法做到這一點(例如'RULES' pragmas)。無論如何,只要你有像打印這樣昂貴的'IO'操作,GADT構造函數的匹配開銷就無關緊要。 – leftaroundabout
感謝您的建議。這不是用於打印整數,真正的代碼以嚴格的循環讀取內存和模式匹配,與沒有模式匹配的基線代碼相比,開銷高達60%。我會嘗試用'RULES'優化它。 – schernichkin
請注意,這種優化也必須與嚴格性分析交互。考慮'printMyMyGADT(undefined :: MyGADT IntConstructor)'。 – Toxaris