更高种类的空约束

时间:2019-04-15 13:32:15

标签: haskell constraint-kinds

我想在更高级别上使用空约束。

假设我有以下课程:

class Category k where
  type Obj k :: * -> Constraint
  id  :: Obj k a => a `k` a
  (.) :: (Obj k a, Obj k b, Obj k c) => b `k` c -> a `k` b -> a `k` c

现在,我想为函数创建一个实例,以使其不会以任何方式约束元素。我可以作为Obj的实例给出什么?

instance Category (->) where
  type Obj (->) = ?
  id    = \a -> a
  f . g = \a -> f (g a)

1 个答案:

答案 0 :(得分:4)

您需要在类声明中为其提供一个明确的附加参数。

class Category k where
  type Obj k a :: Constraint

然后,可以使用类型较低的()空约束轻松定义实例。

instance Category (->) where
  type Obj (->) a = ()