Je le code suivant qui était censé prendre une fonction A => Boolean
(générique du type d'entrée) et le convertir en un trait Y[A]
générique par des conversions implicites enchaînées:Chaînage conversions implicites de fonction à une classe générique
val f: Int => Boolean = ???
trait X[A] {
def m1: Unit
}
implicit def toX[A](f: A => Boolean): X[A] = ???
f.m1 // Works
trait Y[A] {
def m2: Unit
}
implicit def toY[T, A](x: T)(implicit toX: T => X[A]): Y[A] = ???
f.m2 // Won't compile
Malheureusement, la dernière ligne ne sera pas compilée.
Faire une une des changements suivants est suffisant pour permettre la compilation de code:
- En ce
X
non générique - Turning
Y
non générique - Remplacement du type de source (qui est une fonction générique sur le type d'entrée) avec une fonction générique sur le sortie type (
Int => A
) - Re placer le type de source avec d'autres types génériques tels que
Option[A]
,Seq[A]
ouArray[A]
, ma conclusion est que la chaîne de conversions implicites ne fonctionnera pas parce que le type de source (fonction générique du type d'entrée) est générique et contravariant et les types intermédiaires et cibles (X[A]
et Y[A]
) sont génériques.
Des idées pour résoudre ce problème?
MISE À JOUR: Le code final est en retrait pour gérer non seulement une fonction en tant que type de source, par d'autres types aussi bien (Option[A]
, Seq[A]
, A
, etc.). Pour ce faire, l'idée est d'avoir des versions de la fonction toX
qui convertissent chacun de ces types en X[A]
. Alors seulement une version de toY
est désirée.
Ma véritable implémentation utilise déjà des types plus élevés, mais d'une manière très différente. Le code que j'ai posté est juste une version dépouillée essayant d'isoler le problème. Le code final traitera non seulement les fonctions, mais aussi d'autres types de sources ('Option [A]', 'Seq [A]', 'A' lui-même, etc.). Chacun de ces types aura une version de '* toX', mais étant donné une conversion d'un type en' X [A] ', une seule version de' toY' est souhaitée. Donc, votre solution ne fonctionnera pas. :-( – erdavila
Je vais essayer de mettre ces exigences sur ma question. – erdavila