Existe-t-il un moyen de demander aux objets transmis à une fonction de mettre en œuvre un ensemble de méthodes de base? Par exemple, j'aimerais pouvoir écrire une méthode sum pour sommer n'importe quel itérable des objets qui implémentent l'opérateur '+'.Exiger les paramètres de fonction Méthode d'implémentation - Scala
Ma mise en œuvre initiale est la suivante
trait addable[T <: addable[T]]{
def +(other: T): T
}
def sum[T <: addable[T]](items: Iterable[T]) =
if(items.isEmpty) throw new Exception("Can't sum nothing")
else items.tail.foldRight(items.head)(_+_)
//Starst with the first element and adds all other elements to it
Maintenant, cette méthode fonctionne, mais il est maladroit. Si je veux que quelque chose soit sommable, je dois implémenter explicitement [T] dans chaque classe que je veux additionner, sans parler de définir un tas de conversions explicites pour les types numériques et les chaînes.
Existe-t-il un moyen de l'implémenter pour qu'il ressemble à ceci?
def sum[T fulfills addable[T]](items: Iterable[T]) =
if(items.isEmpty) throw new Exception("Can't sum nothing")
else items.tail.foldRight(items.head)(_+_)
Sinon, est-il un bagout de conception qui élimine la nécessité de ce (ce que je fais en ce moment semble effectivement être un peu plus que le motif de l'adaptateur)?
Quels types de choses essayez-vous d'ajouter? – Tyler
J'utiliserais plutôt typeclassing – cchantep
@Tyler, j'ai actuellement besoin d'ajouter juste des nombres et des itérables de nombres (pensez à des vecteurs mathématiques), mais je voudrais avoir la même fonction pour d'autres cas ainsi il peut être réutilisé quand j'ai besoin additionne un autre type de données personnalisé. – CBlumey