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对于我来说,使代码理解更加困难.
使用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宣言要好得多.
我不确定你在寻找什么,但听起来你只是想更容易编写/理解约束签名,在这种情况下这将有效.
| 归档时间: |
|
| 查看次数: |
1181 次 |
| 最近记录: |