静的なボクセルシーンをレンダリングし、途中でHaskellを学習するための最適化手法をいくつか試しています。私はOOPのクラス特化に相当するHaskell
VoxelId
は、単に
Int
の別名である
type Voxel = (VoxelId, Position).
として定義されたボクセルを持っています。私はラインの下で線形代数を予想しているので、Position
は3次元ベクトルを表現したいと思っていました。私が使用しているライブラリ(matrix)はMatrix
のデータ型しか実装していませんが、ポジションの基底型が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
を使用:C++または私はこのような何かを行うことができ、他のオブジェクト指向言語で
。
はのは、私はどのように私はPosition
のためにすべての操作Matrix
実装を再定義することなく、Haskellで、この動作を複製することができます
matrix :: (rows) -> (columns) -> Matrix
コンストラクタ関数を持って使用していますライブラリからMatrix
を想定してみましょうか?
ハスケルでは不変ですが空のベクトルを構成するのは意味がありません。あなたができることは、あなた自身の "スマートなコンストラクタ"(基本的な機能)を定義することです。 '(Double、Double、Double)'を返し、行列を返します。より静的な保証が必要な場合は、結果の行列を 'newtype'ラッパーに入れます(ラッパー上のすべての行列演算を定義するか、毎回ラップ解除する必要があります)。 – chi
Positionのマトリックス操作を再定義することは、第三者のライブラリを使用する目的を破ります。最後の手段として残しておきたいことです。元の質問を編集してより明確にしました。 –
次に、毎回手動でアンラップするか、安全な変換を使用する必要があります。または、次のようにダンベルコンストラクタを使用します。 – chi