6
我可以寫:約束限制
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ConstraintKinds #-}
f :: Integral a => (forall b. Num b => b) -> a
f = id
,一切都很好。據推測GHC可以從Num
派生Integral
,所以一切都很好。
我可以有一些技巧,但我還是罰款:
class Integral x => MyIntegral x
instance Integral x => MyIntegral x
class Num x => MyNum x
instance Num x => MyNum x
f' :: MyIntegral a => (forall b. MyNum b => b) -> a
f' = id
所以可以說,我想概括這一點,就像這樣:
g :: c2 a => (forall b. c1 b => b) -> a
g = id
現在很明顯,這將吐虛擬,因爲GHC不能從c1
派生c2
,因爲c2
不受約束。
我需要添加到g
的類型簽名以說「您可以從c1
中派生c2
」?
當你說「從Y派生X」時,我寧願說「從X派生Y」。在你的第一個例子中,我們認爲'積分'意味着'數字',而不是相反。 GHC必須從傳遞的'Integral'中提取'Num'字典。對於您在下面提到的其他情況也是如此。 – chi