我有一个类型为Shape
的类型声明了许多对所有形状都通用的函数。其中一个函数(refine
)需要返回一个子类型列表。为了表达这个约束,我使用存在量化:通过类型系统表达替代功能集
data Shapeable = forall a . Shape a => Shapeable a
,并有函数返回[Shapeable]
。我有一个额外的约束条件,可以改进一些形状(通过refine
函数),而其他形状可以检查相交(通过intersect
函数)。这些是相互排斥的,因为可以自行优化的形状不能检查相交,反之亦然。
如果我没有使用量化,我会创建两个更多的类型:Intersectable
和Refineable
。有没有一种方法可以在单个类型类似系统中表示不相交的函数集?