3 votes

Pourquoi le code expérimental scala suivant ne fonctionne-t-il pas ?

J'essaie de définir une fonction générique d'ajout à des valeurs numériques :

def add[A](x:A, y:A): A = {
  x + y
}

console:16 : error : type mismatch ; trouvé : A requis : String x + y ^

De quoi le compilateur se plaint-il ? Certaines des informations que j'ai trouvées sur Google n'ont pas vraiment de sens pour moi en ce moment.

10voto

Tzach Zohar Points 6701

Puisque vous définissez A sans limites et sans informations supplémentaires, il pourrait être tout type et aucun type Scala ne possède un + donc cela ne peut pas compiler.

Le message d'erreur est le résultat de la tentative du compilateur de convertir implicitement x en une chaîne (parce que la chaîne a un + et chaque type peut être converti en chaîne de caractères à l'aide de la méthode toString ), mais cela échoue parce que y n'est pas une chaîne.

Pour créer une méthode pour tous les types numériques, vous pouvez utiliser l'option Numeric type :

def add[A](x:A, y:A)(implicit n: Numeric[A]): A = {
  n.plus(x, y)
}

add(1, 3)
add(1.4, 3.5)

EDIT : ou une syntaxe équivalente :

def add[A: Numeric](x:A, y:A): A = {
  implicitly[Numeric[A]].plus(x, y)
}

2voto

Simon Points 4883

Pour pouvoir faire quelque chose comme ça, le compilateur doit savoir que A a une méthode

def +(a: A): A

L'idéal serait donc de faire quelque chose comme

def add[A :< Numeric](x:A, y:A): A = { ... 

mais vous ne pouvez pas car les types numériques en Scala n'ont pas de super type commun (ils étendent AnyVal ). Regardez aquí pour une question connexe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X