【发布时间】:2014-02-16 16:36:42
【问题描述】:
我正在一个 haskell 程序中实现 CSG。 当我在 OOP 语言中这样做时,我受到了 Composite Patron 的启发。
我有一个抽象类“Object”、一些具体对象(球体、平面等)和一个具体类“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
...
现在我为球体、平面、圆柱体等定义实例。
但是复合对象呢?如何创建由两种类型的类构造的类型,类函数取决于构造函数或类似的东西?
【问题讨论】:
标签: haskell functional-programming typeclass raytracing algebraic-data-types