在处理类型族时,使用等式约束通常很方便,以避免在签名中重复某个类型函数的名称:
class Foo f where
type BulkyAssociatedType f :: *
foo :: BulkyAssociatedType f -> f
...
bar :: forall m f b .
( Monad m, Foo f, b ~ BulkyAssociatedType f
, Monoid b, Monoid (m b)
) => f -> m f
即使缩写没有在签名本身中出现,仅在约束中也是如此。
对于课程,这显然是不可能的;
class ( Foo f, b ~ BulkyAssociatedType f, Monoid b, ...) => Bar f
抱怨类型变量b
不在范围内。
是否有某种方法可以实现类似的事情,以避免一些重复 - 样板?
答案 0 :(得分:7)
让我感到惊讶的是,我知道你不能那样做(我使用了同样的技术并知道它在实例声明中有效),但似乎有一个长期的{{3支持这个。
也许你可以使用GHC feature request来获得同样的好处:
{-# LANGUAGE TypeFamilies , FlexibleContexts , ConstraintKinds #-}
import Data.Monoid
class Foo f where
type BulkyAssociatedType f :: *
type B f = (Monoid (BulkyAssociatedType f))
class ( Foo f, B f) => Bar f