私は可能な限り軽量の先物を使用しようとしています。変換を積み重ねることを意味する
は、ここに私の現在のテストコードです:
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
*/
}
抽出しextracted2が働いているが、各唯一私が定義した2つの暗黙的な変換のいずれかを使用しています。
extracted3は、明示的にプラスおよびcst1をFuture [X]値に持ち込み、a <*> b
をap(a,b)
に変換することを目指しています。しかし、コンパイラは私に同意していないようです。
私は可能なことを達成しようとしていますか?もしそうなら、私はそれを動作させるために何を変えなければならないのですか?
PS:これは私は一種の私はHaskellのを使用して見てきたものからインスピレーションを得ました。
'cst'は未定義ですか? – tkachuko
いいえ、2回の暗黙的な変換を同時に行うことはできません。 – flavian