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