在一个函数中将不会编译但在外面它将会

时间:2014-06-11 18:32:49

标签: list scala type-mismatch

def combinations(list: List[(Char, Int)]) : List[List[(Char,Int)]]= {
  val t = List.range(0, 1)
  list match {
    case List() => List()
    case (c,i) :: xs => val res = for {
      o <- List.range(1, i + 1)
      } yield List((c, o)) :: combinations(xs)


  List()


  }

}

如果我尝试返回res而不是List(),我有以下函数将无法编译。这是List(List(List[(Char,Int)]]]的类型不匹配但是这段代码:

 List(('a',10)) :: combinations(List()) 

按照预期完美编译。为什么函数内部不能编译?是不是完全一样?我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的理解产生了List[List[(Char,Int)]]类型的元素。 For-comprehensions将生成他们正在产生的元素的列表,因此在这种情况下将是List[List[List[(Char,Int)]]]

我不完全确定你想要达到的目标,但我认为它会是这样的:

def combinations(list: List[(Char, Int)]) : List[List[(Char,Int)]]= {
  val t = List.range(0, 1)
  list match {
    case Nil => List()
    case (c,i) :: xs => 
      (for {
        o <- List.range(1, i + 1)
      } yield (c, o)) :: combinations(xs)
  }
}

for-comprehension生成一个List[(Char, Int)],它添加在您的组合方法生成的列表的开头。