2016-03-30 33 views
5

È possibile derivare automaticamente l'ordine su una famiglia di tratti sigillati in Scala?Ordinamento automatico/derivato ADT derivato automaticamente in Scala

Per esempio, sarebbe bello essere in grado di fare:

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

(A < B) == True 

Questo si sente come qualcosa di informe può essere in grado di gestire, ma non riesco a vedere se questo esiste attualmente.

risposta

5

Suppongo che si desideri che l'ordine rifletta l'ordine di definizione, non ordinato dai nomi dei costruttori.

Questo non è il posto più divertente che ci si potrebbe aspettare perché knownDirectSubclasses sull'API ClassSymbol restituisce una serie di simboli, non una sequenza ordinata. Non sono un esperto di interni di scalac, ma according to Eugene Burmako (chi è), la firma di knownDirectSubclasses riflette solo ciò che sta accadendo in scalac.

Sono stato complaining about this per anni, a proposito, e in vari punti ho provato cose come reading positions off the symbols, ma non funziona davvero.

Il macchinario generico di Shapeless deve prendere una decisione qui, poiché rappresenta tratti sigillati come coprodotti, che ordinano i loro elementi. Al fine di mantenere le cose deterministico, utilizza i nomi dei costruttori di ordinare i casi:

// 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] 

Se questo è ciò che si vuole, è tutto pronto: basta trovare un goodtutorial sulla derivazione generica Shapeless alimentati e elaborare i dettagli. Purtroppo nella maggior parte dei casi non è probabilmente quello che si vuole, anche se (East, North, South, West? Blue, Green, Red?), E ciò che si vuole (definizione ordinamento) non sembra essere ragionevolmente possibile.

+0

L'esempio in questione potrebbe essere solo illustrativo, ma sul volto di esso, l'ordine alfabetico (che è quello che fornisce informe) è esattamente ciò che è stato chiesto ecco ;-) –

+0

@MilesSabin Abbastanza giusto! Questo è praticamente l'unico esempio a cui posso pensare dove i nomi dei costruttori alfabetici sono ciò che si desidera, comunque. :) –

0

Quando si scrive Enumeratum, sono giunto alla stessa conclusione di Travis, che knownDirectSubclasses non è in grado di fornire informazioni sull'ordine di dichiarazione.

Ancora, però, all'interno del corpo di un dato modulo, l'AST è ancora ordinato (tipo è List[Tree]), in modo che è come sono riuscito a fare declaration-based ordering work e offrire un metodo indexOf. Una volta che hai una sequenza ordinata delle istanze di tratti sigillati, ottenere un Order è abbastanza banale.

Siamo spiacenti, questa non è una risposta Shapeless ..