2016-03-30 14 views
5

Czy możliwe jest automatyczne uzyskanie zamówienia na rodzinie zapieczętowanych cech w Scali?Automatycznie wyprowadzona zaplombowana cecha/zamówienie ADT w Scali

Na przykład, byłoby miło, aby móc to zrobić:

sealed trait Letters 
case object A extends Letters 
case object B extends Letters 

(A < B) == True 

to czuje jak coś bezkształtne może być w stanie obsłużyć, ale nie mogę sprawdzić, czy istnieje obecnie.

Odpowiedz

5

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.

+0

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 ;-) –

+0

@MilesSabin Fair enough! Jest to właściwie jedyny przykład, jaki mogę sobie wyobrazić, jeśli chodzi o nazwy alfabetycznych konstruktorów. :) –

0

Podczas pisania Enumeratum doszedłem do tego samego wniosku co Travis, że knownDirectSubclasses nie jest w stanie dostarczyć informacji o zamówieniu.

Nadal jednak w ciele danego modułu, AST nadal zamawiać (typ jest List[Tree]), więc to, jak udało mi się zrobić declaration-based ordering work i oferują metodę indexOf. Gdy masz uporządkowaną sekwencję zapieczętowanych instancji cech, uzyskanie Order jest dość banalne.

Niestety, to nie jest bezkształtną odpowiedź ..