我有一个类型类Shape,它声明了所有形状共有的许多函数.其中一个函数(refine)需要返回子形状列表.为了表达这种约束,我使用了存在量化:
data Shapeable = forall a . Shape a => Shapeable a
并具有返回功能[Shapeable].我有一个额外的约束,一些形状可以改进(通过一个refine函数),而其他形状可以检查交集(通过一个intersect函数).这些是相互排斥的,因为可以自我修饰的形状不能检查交叉,反之亦然.
如果我没有使用量化,我会创建另外两个类型:Intersectable和Refineable.有没有办法在像系统这样的单个类型类中表达不相交的函数集?
我建议像这样:
data Shape
= Composite
{ refine :: [Shape]
, {- other type-class methods go here -}
}
| Primitive
{ intersect :: Shape -> Region
, {- other type-class methods go here -}
}
Run Code Online (Sandbox Code Playgroud)
...并完全跳过类型类和存在量化.