2016-10-26 5 views
0

가능한 한 가벼운 선물을 사용하려고합니다.스태킹은 변환을 암시합니다.

여기에 내 현재의 테스트 코드입니다 :

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가 작동하지만 각 단지 내가 정의한 두 암시 적 변환 중 하나를 사용하고 있습니다.

추출한 3은 암시 적으로 더하기 및 cst1을 Future [X] 값으로 변환하고 a <*> bap(a,b)으로 변환하는 것을 목표로합니다. 하지만 컴파일러는 나와 동의하지 않는 것 같습니다.

나는 가능한 것을 달성하려고 노력하고 있습니까? 그렇다면 작동하도록 변경하려면 무엇을해야합니까?

추신 : 이것은 내가 haskell을 사용하여 보았던 것에 영감을주었습니다.

+0

'cst'는 정의되어 있지 않습니까? – tkachuko

+0

아니요, 두 개의 암시 적 변환을 동시에 연결할 수 없습니다. – flavian

답변

3

나는 "한 번에 하나씩"규칙에 부딪 치고 있다고 생각합니다. Programming in Scala에서

(1 판) :

한 번에 하나씩 규칙는 : 하나의 암시가 시도됩니다. 컴파일러에서 은 x + y를 convert1 (convert2 (x)) + y로 다시 작성할 수 없습니다. 이렇게하면 컴파일 시간이 오류 코드에 따라 크게 증가하게되고 프로그래머가 작성한 것과 프로그램이 실제로 수행하는 것의 차이가 더 커집니다 ( ). 제발, 컴파일러는 암시 적으로 다른 암시 적 변환을 삽입하려고합니다. 다른 암시 적 변환을 시도하고 있습니다.


는 @tkachuko가 지적한 바와 같이, 암시 적 가능성 파라미터를 이용하여 이러한 제한에 대한 해결 방법이 있지만 간단한 해결책은 두 부분으로 분할 FutureInfix한다.

implicit class FromFutureInfix[A, B](x: Future[A => B]) { 
    def <*>(that: Future[A]) = ap(x, that) 
} 
implicit class ToFutureInfix[A, B](x: A => B) { 
    def <*>(that: A) = ap(x, that) 
} 
+0

그러나 암시 적 def chaining으로 목표를 달성 할 수있는 것처럼 보입니다. http://docs.scala-lang.org/tutorials/FAQ/chaining-implicits.html – tkachuko