J'essaie de rendre mon utilisation des contrats à terme aussi légère que possible.L'empilement implique des conversions
Voici mon code de test en cours:
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scala.util.Failure
import scala.util.Success
object Test1 extends App {
def lift[A](a: A): Future[A] = Future { a }
def ap[A, B](fct: Future[A => B], param: Future[A]): Future[B] =
for {
c <- param
o <- fct
} yield (o(c))
implicit def valToFuture[A](elem: A): Future[A] = lift(elem)
implicit class FutureInfix[A, B](val x: Future[A => B]) extends AnyVal {
def <*>(that: Future[A]) = ap(this.x, that)
}
val plus1: Int => Int = (x: Int) => x + 1
val cst1: Int = 1
val extracted: Future[Int] = ap(plus1, cst1)
val extracted2: Future[Int] = lift(plus1) <*> lift(cst1)
val extracted3: Future[Int] = plus1 <*> cst
/*
* - value <*> is not a member of Int ⇒ Int
* - not found: value cst
*/
}
extrait et extracted2 travaillent mais sont chacun en utilisant seulement l'un des deux conversion implicite que j'ai défini.
extrait3 est ce que je vise, en soulevant implicitement plus et cst1 aux valeurs futures [X] et en convertissant a <*> b
en ap(a,b)
. Mais le compilateur ne semble pas être d'accord avec moi.
Est ce que j'essaye de réaliser possible? Si oui, que dois-je changer pour que ça marche? PS: Ce genre d'inspiré de ce que j'ai vu en utilisant haskell.
'cst' est supposé être indéfini? – tkachuko
non, vous ne pouvez pas enchaîner 2 conversions implicites en même temps. – flavian