通过类型系统表达备用功能集

Abh*_*uch 1 haskell

我有一个类型类Shape,它声明了所有形状共有的许多函数.其中一个函数(refine)需要返回子形状列表.为了表达这种约束,我使用了存在量化:

data Shapeable = forall a . Shape a => Shapeable a

并具有返回功能[Shapeable].我有一个额外的约束,一些形状可以改进(通过一个refine函数),而其他形状可以检查交集(通过一个intersect函数).这些是相互排斥的,因为可以自我修饰的形状不能检查交叉,反之亦然.

如果我没有使用量化,我会创建另外两个类型:IntersectableRefineable.有没有办法在像系统这样的单个类型类中表达不相交的函数集?

Dan*_*ner 5

我建议像这样:

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)

...并完全跳过类型类和存在量化.