约束类型族
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
.
我在 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
.