约束类型族

Contrained type familly

我在 haskell 中有以下类型系列:

type family Foo (a :: Bar) :: * where

后面是一堆相等。我想对种类 return 施加约束以确保它们都是类型类的实例。我该怎么做?

在Haskell中,最好不要那样做。 (另请参见在数据声明中对类型变量施加约束的愿望。)您应该在实际将要使用它们的地方放置约束。如果它在需要时丢失,它仍然会在类型检查期间被调用,但它会让不需要它的东西更加灵活。

您似乎在寻找

class (YourConstraint (Foo a)) => Fooish (a :: Bar) where
  type Foo a :: Type

正如 Carl 所说,这有点类似于旧的数据声明样式

data C a => D a = D ...

这被广泛认为是一个坏主意,因为不可能使用约束,它所做的只是防止构建不遵守约束的值。

但与那些数据声明不同,对关联类型族的约束 有用的 IMO,因为有一种简单的方法可以在需要时获得约束:您只需要提及 Fooish.