如何使用yield语句返回不同的集合

时间:2013-03-19 13:27:52

标签: scala

根据我的有限知识,我知道编译器会自动继承集合返回类型,并根据它确定要返回的集合类型,因此在下面的代码中我想返回Option[Vector[String]]

我尝试使用以下代码进行试验,然后出现编译错误

type mismatch;  found   : scala.collection.immutable.Vector[String]  required: Option[Vector[String]]   

代码:

def readDocument(v:Option[Vector[String]]) : Option[Vector[String]] =    
{
   for ( a <- v;  
   b <- a )
     yield 
     {
        b
     }
}

3 个答案:

答案 0 :(得分:2)

scala> for (v <- Some(Vector("abc")); e <- v) yield e
<console>:8: error: type mismatch;
 found   : scala.collection.immutable.Vector[String]
 required: Option[?]
              for (v <- Some(Vector("abc")); e <- v) yield e
                                               ^

scala> for (v <- Some(Vector("abc")); e = v) yield e
res1: Option[scala.collection.immutable.Vector[String]] = Some(Vector(abc))

嵌套x <- xs表示flatMap,仅当返回的类型与the most outer one的类型相同时才有效。

答案 1 :(得分:0)

for理解已为您Option取消装箱,所以这应该有效

def readDocument(v:Option[Vector[String]]) : Option[Vector[String]] =    
{
  for ( a <- v )
  yield 
  {
    a
  }
}

答案 2 :(得分:0)

这个怎么样?

  def readDocument(ovs: Option[Vector[String]]): Option[Vector[String]] =
    for (vs <- ovs) yield for (s <- vs) yield s