En Scala, j'aimerais pouvoir écrire des classes génériques qui utilisent des opérateurs comme>, /, * etc, mais je ne vois pas comment contraindre T de telle sorte que cela fonctionne. J'ai regardé dans T contraignant avec Ordered [T], mais cela ne semble pas fonctionner puisque seulement RichXXX (par exemple RichInt) l'étendent, pas Int etc. J'ai également vu Numeric [T], est-ce seulement disponible dans Scala 2.8?Scala: Quel est le meilleur moyen d'effectuer des opérations numériques dans des classes génériques?
Voici un exemple précis:
class MaxOfList[T](list: List[T]) {
def max = {
val seed: Option[T] = None
list
.map(t => Some(t))
// Get the max
.foldLeft(seed)((i,m) => getMax(i,m))
}
private def getMax(x: Option[T], y: Option[T]) = {
if (x.isDefined && y.isDefined)
if (x > y) x else y
else if (x.isDefined)
x
else
y
}
}
Cette classe ne compile pas, car il y a beaucoup Ts qui ne prennent pas en charge> etc.
pensées?
Pour l'instant, j'ai utilisé un trait MixIn pour contourner ceci:
/** Defines a trait that can get the max of two generic values
*/
trait MaxFunction[T] {
def getMax(x:T, y:T): T
}
/** An implementation of MaxFunction for Int
*/
trait IntMaxFunction extends MaxFunction[Int] {
def getMax(x: Int, y: Int) = x.max(y)
}
/** An implementation of MaxFunction for Double
*/
trait DoubleMaxFunction extends MaxFunction[Double] {
def getMax(x: Double, y: Double) = x.max(y)
}
qui si nous modifions la classe d'origine peut être mélangé au moment de l'instanciation.
P.S. Mitch, inspiré par votre re-écriture de getMax, voici une autre:
private def getMax(xOption: Option[T], yOption: Option[T]): Option[T] = (xOption,yOption) match {
case (Some(x),Some(y)) => if (x > y) xOption else yOption
case (Some(x), _) => xOption
case _ => yOption
}
Merci encore Mitch. Je jure que j'ai essayé ça et que je n'ai pas pu le compiler! –
J'ai ajouté une mise à jour à la question originale avec une autre version de getMax inspirée par la vôtre. –
J'ai mis à jour mon getMax avec encore une autre version inspirée par la vôtre. Combien d'autres itérations avant d'atteindre une sorte de singularité? –