是否可以将其他类型变量引入超类约束?

时间:2014-01-21 22:03:46

标签: haskell typeclass type-constraints type-families

在处理类型族时,使用等式约束通常很方便,以避免在签名中重复某个类型函数的名称:

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不在范围内。

是否有某种方法可以实现类似的事情,以避免一些重复 - 样板?

1 个答案:

答案 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