Zakładam, że chcesz, aby kolejność odzwierciedlała kolejność definicji, a nie porządkowanie według nazw konstruktorów.
To nie jest tak zabawne, jak można by oczekiwać, ponieważ knownDirectSubclasses
na interfejsie API ClassSymbol
zwraca zestaw symboli, a nie uporządkowaną sekwencję. Nie jestem ekspertem od wewnętrznych elementów skalac, ale according to Eugene Burmako (kto jest), podpis knownDirectSubclasses
tylko odzwierciedla to, co dzieje się w skalaku.
Przez lata byłem complaining about this iw różnych punktach próbowałem takich rzeczy jak reading positions off the symbols, ale to naprawdę nie działa.
Generalna maszyna Shapeless musi tu podjąć decyzję, ponieważ reprezentuje ona zapieczętowane cechy jako produkty uboczne, które porządkują ich elementy. W celu utrzymania rzeczy deterministyczny, używa nazwy konstruktorów zamówić przypadki:
// Entering paste mode (ctrl-D to finish)
sealed trait Letters
case object B extends Letters
case object A extends Letters
// Exiting paste mode, now interpreting.
defined trait Letters
defined object B
defined object A
scala> shapeless.Generic[Letters]
res5: shapeless.Generic[Letters]{type Repr = shapeless.:+:[A.type,shapeless.:+:[B.type,shapeless.CNil]]} = [email protected]
Jeśli to, co chcesz, masz wszystko ustawione, tylko znaleźć goodtutorial na Shapeless-powered generycznego wyprowadzeniu i opracuj szczegóły. Niestety w większości przypadków to nie jest chyba to, co chcesz, choć (East
, North
, South
, West
? Blue
, Green
, Red
?), I co chcesz (kolejność definicji) nie wydaje się być w miarę możliwości.
Przykład w pytaniu może być tylko ilustracyjny, ale na pierwszy rzut oka, w porządku alfabetycznym (co jest, co zapewnia bezkształtna) jest dokładnie to, o co prosi o tutaj ;-) –
@MilesSabin Fair enough! Jest to właściwie jedyny przykład, jaki mogę sobie wyobrazić, jeśli chodzi o nazwy alfabetycznych konstruktorów. :) –