정적 보셀 (static voxel) 장면을 렌더링하고 하스켈을 배우는 몇 가지 최적화 기법을 테스트하고 있습니다. VoxelId
단순히 Int
의 별칭입니다 어디하스켈이 OOP의 클래스 전문화에 해당합니다.
type Voxel = (VoxelId, Position).
로 정의 복셀 있습니다. 선상의 선형 대수학을 예상하기 때문에, 나는 Position
이 3 차원 벡터를 나타 내기를 원했습니다. 라이브러리 (matrix)는 Matrix
데이터 유형 만 구현하지만 Position은 기본 유형이 Matrix
이므로 더 많은 계산을 단순화하기 때문에 괜찮습니다.
그러나, Position
3 차원 벡터에 비해 아무것도 할 것이 훨씬 이해가되지 않습니다, 그래서 3 × 1 행렬에 Position
을 제한하고 싶습니다, 그래서 함수 서명에 특별히 Position
사용할 때, 나는 ' 3x1 행렬 또는 컴파일 오류가 예상됩니다.
class Matrix
{
Matrix(int rows, int columns)
{}
}
class Position : public Matrix
{
Position()
: Matrix (3, 1)
{}
}
을 내가 다른 곳에가 매트릭스 단 3 × 1 행렬 및 참조를 예상 할 때 Position
를 사용
++ 또는 다른 OO 언어 나는 이런 식으로 뭔가를 할 수 있습니다.
는이 전
matrix :: (rows) -> (columns) -> Matrix
가 어떻게 Position
모든 작업 Matrix
구현에 대한 재정의하지 않고 하스켈에서이 동작을 복제 할 수있는 생성자 함수를 가지고 사용하고 라이브러리에서 Matrix
을 가정 해 봅시다?
하스켈에서 불변이지만 빈 벡터를 구성하는 것은 의미가 없습니다. 당신이 할 수있는 것은 자신 만의 "스마트 생성자"(기본 함수)를 정의하는 것입니다. '(Double, Double, Double)'을 선택하고 행렬을 반환합니다. 좀 더 정적 인 보장을 원할 경우 결과 행렬을 newtype 래퍼에 넣으십시오 (래퍼에 대한 모든 행렬 연산을 정의하거나 매번 언 래핑해야합니다). – chi
Position에 대한 행렬 작업 재정의는 타사 라이브러리 사용의 목적을 무효화하며 최후의 해결책으로 남겨두고있는 것입니다. 더 명확하게하기 위해 원래의 질문을 편집했습니다. –
그런 다음 매번 수동으로 언 랩핑하거나 안전한 강제 변환을 사용해야합니다. 또는 아래와 같이 멍청한 생성자를 사용하십시오. – chi