könnten Sie auch eine dritte Option in Betracht ziehen, die Art einer Kombination der beiden ist: newtype
newtype Ray = Ray (Vector, Vector)
Algebraische Datentypen, meiner Meinung nach, in Situationen verwendet werden, wenn Sie mehrere Alternativen haben, oder in Fällen, in denen Sie benötigen den Typ, der rekursiv ist und sich selbst enthält. Aber es könnte für so etwas übertrieben sein.
Don Stewart wies darauf hin, dass die Erstellung eines Typ-Synonyms für Tupel dasselbe ist wie die direkte Verwendung des Tupeltyps; Typ Synonyme haben keine eigene Identität. Der Typprüfer kann also nicht zwischen Ihrem Typ und einem Tupel unterscheiden und kann daher nicht überprüfen, ob Sie den gewünschten Typ verwenden. Außerdem würde es genau dieselben Instanzen wie ein Tupel haben.
Ein newtype
ermöglicht es Ihnen, den gleichen zugrunde liegenden Typ wie das Tupel zu verwenden; aber es ist ein separater Typ für den Typ Checker mit separaten Instanzen.
Rechts. Und ein kritischer Punkt über Typen: Sie sind so viel mehr als nur die Darstellung von Daten; sie charakterisieren nützliche Struktur. – pigworker
Okay, das macht Sinn. 'type' ist eigentlich nur ein Synonym, kein neuer Datentyp. Aber die Linie muss irgendwo gezeichnet werden - "type Color = (Int, Int, Int)" wäre angemessen, oder? – mk12
Nein, aus Performance-Gründen ist es sinnvoller, einen gepackten Vektortyp für Color zu haben, wie im Farbpaket - aussagekräftige Typen wie diese können optimiert und spezialisiert werden. http://hackage.haskell.org/packages/archive/colour/2.3.3/doc/html/src/Data-Colour-Internal.html#Colour –