我玩弄單身的專業化:專業單參數
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
module Data.Test where
data SingBool (b :: Bool) where
STrue :: SingBool 'True
SFalse :: SingBool 'False
sing :: SingBool b -> Bool
sing SFalse = False
sing STrue = True
{-# SPECIALIZE sing :: SingBool 'False -> Bool #-}
這個專門爲類似如下:
singSFalse :: SingBool 'False -> Bool
singSFalse SFalse = False
我希望它產生的singSFalse _ = False
的RHS代替。
這種強制解壓只是爲了滿足類型檢查器,還是在模式匹配中涉及實際的運行時開銷?我想GHC不會放棄參數的模式匹配來解釋bottom
,以免增加懶惰。但是我希望在我開始通過Proxy
+ a SingI
-樣式類型開始建模之前,我很確定。
我認爲你的診斷是正確的,但我應該提到,最後我聽說GHC文檔是關於'SPECIALIZE'和GADT的謊言。該編譯指示(可能)不起作用,並且如果通過構造函數專門化發生特化。 – dfeuer
嗯,這解釋了警告(沿着'SPECIALIZE在這裏沒有效果')。但即使在我的更大的用例中,GHC也可以在沒有警告的情況下正確地專注於模塊邊界,這可能是因爲還有一些類型的類字典,我並沒有真正專注於這些字典。 編輯:這可能要反正做可以內聯...... –
,我與該類型級解決方案https://github.com/sgraf812/pomaps/blob/ebfad35ca1864c6cb8f5921fb804cac26ca944f7/library/Data/POMap/Internal去。hs#L207-L211 –