2013-09-23 2 views
0

이런 식으로 guard가있는 이해력을 사용하면 오류가 발생합니다.가드가 if error를 쓰는 경우

코드 :

for { 
    foo <- Left[String,String]("teststring").right 
    bar <- Right[String,String]("teststring").right if (foo==bar) 
} yield (bar) 

오류 :

error: type mismatch; 
found : Option[scala.util.Either[Nothing,String]] 
required: scala.util.Either[?,?] 
       bar <- Right[String,String]("teststring").right if (foo==bar) 
        ^

답변

0

이 내가 위의 오류를 수정 한 것입니다. 나는 또한 if-guard를 나중에 처리하도록 이동합니다.

val result = for { 
    foo <- Right[String,String]("teststring").right 
    bar <- Right[String,String]("teststring").right 
} yield (foo, bar) 

result fold (
    ex => Left("Operation failed with " + ex), 
    v => v match { 
    case (x,y) => 
     if (x == y) Right(x) 
     else Left("value is different") 
    } 
) 
0

당신은 당신이 for -comprehension need to be of the same type에서 모든 명령문의 종류부터하려고 노력하고, 그리고 if (foo == bar) 필터 식 마지막 표현 대신 Either[?,?]Option[Either[?,?]]을 만드는 일을 할 수 없습니다.

이 문제를 해결하는 방법 중 하나는 표현식을 flatMap, mapfilter 표현식으로 변경하는 것입니다.

또 다른 방법은 하나의 왼쪽을 잃고, 그냥 RightProjection에 toOption 방법을 사용하는 것입니다, 즉 :

for { 
    foo <- Left[String,String]("left").right.toOption 
    bar <- Right[String,String]("right").right.toOption if (foo == bar) 
} yield (foo)