Ich teste einige Optimierungstechniken für das Rendern statischer Voxelszenen und lerne etwas Haskell auf dem Weg. Ich habe Voxel definiert alsHaskell entspricht der Klassenspezialisierung in OOP
type Voxel = (VoxelId, Position).
wo VoxelId
einfach für Int
ein Alias ist. Da ich eine lineare Algebra entlang der Linie antizipiere, wollte ich Position
3-dimensionalen Vektor darstellen. Bibliothek, die ich verwende (matrix) implementiert nur Matrix
Datentyp, aber mit Position haben zugrunde liegenden Typ von Matrix
nur vereinfachen weitere Berechnungen, damit ich damit einverstanden bin.
Allerdings ist es nicht viel Sinn für Position
anders als 3-dimensionale Vektor etwas zu sein, so würde Ich mag Position
zu 3x1 Matrizen beschränken, so dass, wenn ich speziell Position
in einer Funktion Signatur verwenden, I‘ m garantiert entweder 3x1 Matrix oder Kompilierungsfehler.
In C++ oder andere OO Sprache, die ich so etwas tun könnte:
class Matrix
{
Matrix(int rows, int columns)
{}
}
class Position : public Matrix
{
Position()
: Matrix (3, 1)
{}
}
und Position
verwenden, wenn ich nur 3x1 Matrix und Referenz erwarte überall sonst auf Matrix.
die Matrix
aus der Bibliothek übernehmen Lassen ich bin mit einer Konstruktorfunktion
matrix :: (rows) -> (columns) -> Matrix
Wie kann ich dieses Verhalten in Haskell replizieren, ohne Matrix
Geräte für Position
alle Operationen neu zu definieren?
Es macht wenig Sinn, einen unveränderlichen, aber leeren Vektor in Haskell zu konstruieren. Was Sie tun können, ist Ihren eigenen "intelligenten Konstruktor" (eine Grundfunktion) zu definieren, der nur z.B. '(Double, Double, Double)' und gibt die Matrix zurück. Wenn Sie mehr statische Garantien haben möchten, fügen Sie die resultierende Matrix in einen "newtype" -Wrapper ein (beachten Sie, dass dazu auch alle Matrixoperationen auf dem Wrapper definiert oder jedes Mal neu entpackt werden müssen). – chi
Die Neudefinition von Matrix-Operationen für Position widerlegt den Zweck der Verwendung von Drittanbieter-Bibliotheken und es ist etwas, das ich als letzte Lösung verlasse. Ich habe die ursprüngliche Frage bearbeitet, um sie klarer zu machen. –
Dann müssen Sie jedes Mal manuell auspacken oder sichere Zwänge verwenden. Oder benutze einen dümmer Konstruktor wie ich unten zeige. – chi