2017-05-14 1 views
1

J'essaie d'ajouter implicitement des fonctions à la classe Symbol via deux niveaux d'implicits (comme décrit here). Considérez le code suivant:Ombre any2stringadd lors de la conversion implicite du symbole

case class A(s: Symbol) 
case class B(s: A) { 
    def +[X](s: X)(implicit xtoa: X=>A) = B(xtoa(s)) 
} 
implicit def xToB[X](s: X)(implicit xtoa: X => A) = B(xtoa(s)) 
implicit def symbolToA(s: Symbol) = A(s) 

val x = 'a + 'b 

Ce programme ne compile pas:

Error: value + is not a member of Symbol

Il semble que le problème est qu'au lieu de choisir les implicits définis dans le snipped, scala convertit 'a avec la fonction any2stringadd . En fait, les deux expériences semblent faire la compilation de code suivant:

  • je peux utiliser un nom de fonction différente au lieu de + (comme add par exemple)
  • J'ombre explicitement any2stringadd dans les importations: import Predef.{any2stringadd => _ , _}

Je n'aime pas les solutions. Ma question est, y at-il un autre moyen de reformuler mon programme pour convaincre scala de choisir mes implicits à la place?

NB: J'utilise scala 2.12.1. Fait intéressant, IntelliJ ne se plaint pas de cet extrait.

Répondre

1

Vous pouvez importer une autre chose nommée any2stringadd.

object myDsl { 
    object any2stringadd 

    case class A(s: Symbol) 
    case class B(s: A) { 
    def +[X](s: X)(implicit xtoa: X=>A) = B(xtoa(s)) 
    } 
    implicit def xToB[X](s: X)(implicit xtoa: X => A) = B(xtoa(s)) 
    implicit def symbolToA(s: Symbol) = A(s) 
} 

import myDsl._ 
val x = 'a + 'b