Il modo più semplice è definire un Ordine implicito [T] su di essi, ma in seguito è necessario passare questo ordine alla funzione di ordinamento (o qualsiasi altra funzione che desideri confrontarli). È anche possibile passarlo implicitamente.
Un altro modo sarebbe, per estendere la classe tupla dall'operatore < tramite un cast implicito:
implicit def compareTuple[T](lhs: (T,T)) = new {
def <(rhs: (T,T)) = lhs._1<rhs._1 || (lhs._1==rhs._1 && lhs._2<rhs._2)
}
edit: Se si desidera avere gli altri operatori di confronto troppo, si potrebbe ottenere loro ereditando dalla ordinato [T]:
implicit def compareTuple[T](lhs: (T,T)) = new Ordered[(T,T)] {
def compare(rhs: (T,T)) = ...
}
EDIT2: Se hai bisogno anche di confrontare tuple di diverse dimensioni, è possibile utilizzare la funzione productIterator definita in tutte le classi di tuple (see documentation) e consente di ottenere un iteratore sulla tupla. In questo modo potresti scrivere una funzione come faresti con una lista.
Edit3: Questo sarebbe qualcosa di simile:
implicit def compareTuple[T <: Product](lhs: T) = new Ordered[T] {
def compare[U <: Product](rhs: U) = {
def compare(lhs: Any, rhs: Any) = ...
def iteratorCompare(lhs: Iterator[Any], rhs: Iterator[Any]):Int =
if(!lhs.hasNext)
if(!rhs.hasNext)
0
else
-1
else if(!rhs.hasNext)
1
else
compare(lhs.next,rhs.next)
iteratorCompare(lhs.productIterator,rhs.productIterator)
}
}
Ma con questo approccio si deve prendere cura sui tipi. Poiché la funzione non conosce i tipi di elementi della tupla (possono essere diversi all'interno della stessa tupla), può solo fornirti un Iterator [Qualsiasi]. Quindi devi definire una funzione di confronto (Qualsiasi, Qualsiasi) per gestire ciò che desideri.
Buoni punti, Daniel. Ho modificato la mia domanda per dichiarare che le tuple hanno sempre la stessa priorità. Per quanto riguarda i tipi non ordinati, le mie tuple dovrebbero avere simboli (questa è la ragione per cui ho scelto le tuple anziché le liste), ma poiché non ho trovato alcun modo di ordinare simboli, userò, invece, numeri. Dovrei usare le liste allora? Cosa succede se ho davvero bisogno di aggiungere simboli alla lista? – lasaro
@lasaro Bene, ora che hai semplificato il problema, c'è una soluzione relativamente facile. Vedi la risposta modificata. –
Grazie Daniel, per il tuo esempio molto conciso. – lasaro