在所有类型族实例上键入约束

mod*_*lar 9 haskell types type-families

我想如果没有模板Haskell,我想要的是不可能的,但无论如何我都会问.

我有一个类似Data.Set和类型的接口Data.IntSet:

type family Elem s :: *
class SetLike s where
  insert :: Elem s -> s -> s
  member :: Elem s -> s -> Bool
  ...

type instance Elem (Set a) = a
instance Ord a => SetLike (Set a) where
  ...
Run Code Online (Sandbox Code Playgroud)

我有一个类型系列,它选择最佳集合实现:

type family EfficientSet elem :: *
type instance EfficientSet Int = IntSet
type instance EfficientSet String = Set String -- or another implementation
Run Code Online (Sandbox Code Playgroud)

有没有办法保证EfficientSet实例永远都是SetLike这样Elem (EfficientSet a)a

如果没有这个保证,所有功能签名将如下所示:

type LocationSet = EfficientSet Location
f :: (SetLike LocationSet, Elem LocationSet ~ Location) => ...
Run Code Online (Sandbox Code Playgroud)

每次编写SetLike LocationSet都是可以容忍的,但是Elem LocationSet ~ Location对于我来说,使代码理解更加困难.

Phi*_* JF 7

使用GHC 7.4的约束种类,你可以有类似的东西

type EfficientSetLike a = (SetLike (EfficientSet a),Elem (EfficientSet a) ~ a)
Run Code Online (Sandbox Code Playgroud)

您可以(使用适当的扩展)在早期版本的GHC中获得这样的约束

class (SetLike (EfficientSet a),Elem (EfficientSet a) ~ a) => EfficientSetLike a 
instance (SetLike (EfficientSet a),Elem (EfficientSet a) ~ a) => EfficientSetLike a 
Run Code Online (Sandbox Code Playgroud)

但是,新风格type宣言要好得多.

我不确定你在寻找什么,但听起来你只是想更容易编写/理解约束签名,在这种情况下这将有效.