También puede considerar una tercera opción que es una especie de combinación de los dos: newtype
newtype Ray = Ray (Vector, Vector)
tipos de datos algebraicos, en mi opinión, se utiliza en situaciones en las que tiene varias alternativas, o en los casos en necesitas que el tipo sea recursivo, conteniéndose a sí mismo. Pero podría ser demasiado para algo como esto.
Don Stewart señaló que hacer un sinónimo de tipo para tupla es lo mismo que usar ese tipo de tupla directamente; Los sinónimos tipo no tienen identidad propia. Por lo tanto, el verificador de tipos no podrá distinguir entre su tipo y una tupla, por lo que no puede verificar si está utilizando el tipo que desea. Además, tendría las mismas instancias exactas que una tupla.
A newtype
le permite usar el mismo tipo subyacente que la tupla; pero es un tipo diferente al verificador de tipos, con instancias separadas.
Derecha. Y un punto crítico sobre los tipos: son mucho más que la representación de datos; ellos caracterizan la estructura útil. – pigworker
Está bien, eso tiene sentido. 'type' es realmente solo para un sinónimo, no un nuevo tipo de datos. Pero la línea tiene que dibujarse en alguna parte, 'tipo Color = (Int, Int, Int)' sería apropiado, ¿no? – mk12
No, por razones de rendimiento, tiene más sentido tener un tipo de vector empaquetado para Color, como en el paquete de color: tipos significativos como este pueden optimizarse y especializarse. http://hackage.haskell.org/packages/archive/colour/2.3.3/doc/html/src/Data-Colour-Internal.html#Colour –