Scala 用于理解if-guard抛出的错误

Scala 用于理解if-guard抛出的错误,scala,monads,for-comprehension,either,Scala,Monads,For Comprehension,Either,当我以这种方式使用if-guard进行理解时,会出现一个错误 代码: 用于{ foo这就是我修复上述错误所做的。我还将if guard移到后面的过程中 val result = for { foo <- Right[String,String]("teststring").right bar <- Right[String,String]("teststring").right } yield (foo, bar) result fold ( ex => Left

当我以这种方式使用if-guard进行理解时,会出现一个错误

代码:

用于{

foo这就是我修复上述错误所做的。我还将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")
  } 
)
val result=for{
foo v match{
案例(x,y)=>
如果(x==y)右(x)
左上角(“值不同”)
} 
)

你不能做你想做的事情,因为
中所有语句的类型都是为了理解
,而
if(foo==bar)
过滤器表达式使最后一个表达式成为
选项[要么[?,?]
而不是
要么[?,?]

解决此问题的一种方法是将表达式分解为一系列
flatMap
map
filter
表达式

另一种方法是丢失其中一个的左侧,只需使用右侧投影上的
选项
方法,即:

for {
  foo <- Left[String,String]("left").right.toOption
  bar <- Right[String,String]("right").right.toOption if (foo == bar)
} yield (foo)
用于{
福
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")
  } 
)
for {
  foo <- Left[String,String]("left").right.toOption
  bar <- Right[String,String]("right").right.toOption if (foo == bar)
} yield (foo)