考虑这个没用的小例子:
{-# LANGUAGE TypeFamilies #-}
f :: (b ~ [a], Show b) => a -> Int
f _ = 0
使用FlexibleContexts
扩展程序,可以将f
的上下文替换为等效但更具可读性的上下文:
f :: Show [a] => a -> Int
现在只考虑使用class而不是function来设置相同的设置:
{-# LANGUAGE TypeFamilies, FlexibleContexts #-}
class Show [a] => F a
如果我尝试用等效但不太可读的
替换F
的上下文
class (b ~ [a], Show b) => F a
然后我从GHC获得Not in scope: type variable ‘b’
。
为什么不能在类上下文中使用额外的类型变量?
这种限制的原因是什么?