2013-02-21 6 views
0

Я пытаюсь создать функцию перекрестного произведения в Scala, где k - это количество раз, когда я строил кросс-продукт.Scala допускает неправильный тип при использовании foldLeft

val l = List(List(1), List(2), List(3)) 
(1 to k).foldLeft[List[List[Int]]](l) { (acc: List[List[Int]], _) => 
    for (x <- acc; y <- l) 
     yield x ::: l 
} 

Однако этот код не компилируется:

test.scala:9: error: type mismatch; 
    found : List[List[Any]] 
    required: List[List[Int]] 
    for (x <- acc; y <- l) 
     ^

Почему это никогда не задумывалась у меня есть List[Any] там? Ясно, что все, что я имею в виду, это List s Int s.

ответ

4

Для понимания вы получаете List [List [Int или List [Int]]], поэтому выводимым типом является List [List [Any]]. Вот пример из ответа:

scala> val l = List(List(1), List(2), List(3)) 
l: List[List[Int]] = List(List(1), List(2), List(3)) 
val x = for { 
    |  x <- l 
    |  y <- l 
    | } yield x ::: l 
x: List[List[Any]] = List(List(1, List(1), List(2), List(3)), List(1, List(1), List(2), List(3)), List(1, List(1), List(2), List(3)), List(2, List(1), List(2), List(3)), List(2, List(1), List(2), List(3)), List(2, List(1), List(2), List(3)), List(3, List(1), List(2), List(3)), List(3, List(1), List(2), List(3)), List(3, List(1), List(2), List(3))) 
+0

Argh! Это просто опечатка :(, и я смотрел на это час. Извините за то, что тратил свое время! – knub

+0

Рад помочь :) – Noah

Смежные вопросы