0

我在haskell程序中实现CSG。 当我在OOP语言中做到这一点时,我受到了复合赞助人的启发。我有一个抽象类“对象”,一些具体的对象(球体,平面等)和一个具体的类“CompositeObject”,一个运算符和两个指向Object的指针。功能性编程中的建设性固体几何

为了实现在Haskell这样,我是在一个递归数据类型想着CSG树:

data Shape = Sphere (..some types here..) 
      | ..other primitive objects.. 
      | Composite Shape Op Shape 

然后我在通过模式匹配对象定义的功能。 这里的问题是,所有的对象都必须在这个模块中。所有的物体都集中在一块巨石中。

我认为这是具有一个对象的类型类是一个好主意:

class Shape a where 
    intersection :: Ray -> a -> [Points] 
    normal  :: Point -> a -> Vector 
    ... 

现在我定义球体,平面,cilinder实例等

但对于复合对象?我如何创建一个由两种类型构造的类型,类的功能取决于构造函数,或类似的东西?

回答

8

通常的模式是跳过级,只是让它的数据,这样的:

data Shape = Shape 
    { intersection :: Ray -> [Point] 
    , normal  :: Point -> Vector 
    } 

那么你将有一个像sphere是采取了位置和半径,产生了Shape功能;或者是一个复合对象,它需要两个Shape并且对它们做了些什么。