0

저는 haskell 프로그램에서 CSG를 ​​구현하고 있습니다. OOP lahguage에서 그렇게했을 때 나는 복합 수호 영감에 영감을 받았다.함수형 프로그래밍에서의 단단한 도형

나는 추상 클래스 "Object", 몇 가지 구체적인 객체 (Sphere, plane, 등) 및 연산자에 대한 구체적인 클래스 "CompositeObject"와 Object에 대한 두 개의 포인터를 가졌습니다.

내가 재귀 데이터 형식에 생각 하스켈에서 그런 식으로 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에 대한 인스턴스를 정의

는 그 객체에 대한 typeclass을 갖는 좋은 아이디어라고 생각? 생성자에 따라 클래스 함수를 사용하거나 두 가지 유형의 클래스로 구성된 유형을 만들려면 어떻게해야합니까?

답변

8

일반적인 패턴은 다음과 같이 클래스를 생략하고 그냥 데이터를 확인하는 것입니다 :

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

그럼 당신은 위치와 반경을 가져 갔고, Shape 생산 sphere 같은 기능을 할 것이다; 또는 두 개의 Shape을 가져 와서 무언가를 한 복합 객체.

관련 문제