函数式编程中的构造性实体几何

lan*_*ndo 0 haskell functional-programming raytracing typeclass algebraic-data-types

我正在一个haskell程序中实现CSG.当我在OOP lahguage中做到这一点时,我受到了复合赞助人的启发.

我有一个抽象类"对象",一些具体对象(球体,平面等),以及一个具体的类"CompositeObject",其中包含一个运算符和两个指向Object的指针.

为了在Haskell中以这种方式实现CSG树,我正在考虑递归数据类型:

data Shape = Sphere (..some types here..)
           | ..other primitive objects..
           | Composite Shape Op Shape 
Run Code Online (Sandbox Code Playgroud)

然后我通过模式匹配在对象上定义函数.这里的问题是所有对象都必须在此模块中.所有物体都集中在整体中.

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

class Shape a where
  intersection :: Ray   -> a -> [Points]
  normal       :: Point -> a -> Vector
  ...
Run Code Online (Sandbox Code Playgroud)

现在我为Sphere,plane,cilinder等定义实例.

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

Dan*_*ner 8

通常的模式是跳过类并将其设为数据,如下所示:

data Shape = Shape
    { intersection :: Ray -> [Point]
    , normal       :: Point -> Vector
    }
Run Code Online (Sandbox Code Playgroud)

然后你会有像sphere这样的函数占据一个位置和一个半径并产生一个Shape; 或者是一个复合对象,用了两个Shapes并用它们做了一些事情.