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

时间:2014-02-16 16:36:43

标签: haskell functional-programming typeclass raytracing algebraic-data-types

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

我有一个抽象类“对象”,一些具体对象(球体,平面等),以及一个具体的类“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
  ...

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

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

1 个答案:

答案 0 :(得分:8)

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

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

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