Można również rozważyć trzecią opcję, która jest swego rodzaju połączeniem dwóch: newtype
newtype Ray = Ray (Vector, Vector)
algebraiczne typy danych, moim zdaniem, są stosowane w sytuacjach, gdy masz wiele alternatyw, lub w przypadkach, gdy potrzebujesz typu, aby był rekursywny, zawierający się. Ale może to być przesada dla czegoś takiego.
Don Stewart zwrócił uwagę, że tworzenie synonimów dla krotki jest tym samym, co używanie bezpośrednio tego typu krotki; synonimy typu nie mają własnej tożsamości. Tak więc sprawdzanie typu nie byłoby w stanie odróżnić typu i krotki, więc nie może sprawdzić, czy używasz tego typu, w którym chcesz. Ponadto miałoby to dokładnie takie same przypadki, jak krotka.
A newtype
pozwala na użycie tego samego bazowego typu co krotka; ale jest to osobny typ do sprawdzania typu, z osobnymi instancjami.
Dobrze. I krytyczny punkt dotyczący typów: dotyczą one znacznie więcej niż reprezentacji danych; charakteryzują użyteczną strukturę. – pigworker
OK, to ma sens. "typ" jest tak naprawdę dla synonimu, a nie dla nowego typu danych. Ale linia musi być gdzieś narysowana - odpowiedni kolor = (Int, Int, Int) byłby odpowiedni, prawda? – mk12
Nie, ze względu na wydajność bardziej sensowne jest posiadanie zapakowanego typu wektorowego dla Kolorów, jak w pakiecie kolorystycznym - znaczące rodzaje, takie jak ten, mogą być zoptymalizowane i wyspecjalizowane. http://hackage.haskell.org/packages/archive/colour/2.3.3/doc/html/src/Data-Colour-Internal.html#Colour –