2013-04-04 15 views
6

Próbowałem przekonwertować tę funkcję Scala, aby zwrócić leniwy strumień zamiast z niecierpliwością odzyskać wszystkie wyniki i przekonwertować je z Seq na strumień, gdy wszystkie wyniki są obecne. Mam wrażenie, że problem leży w (dla (i < - od 1 do 9; z < - rozwiązać (xs.updated (pos, i), pos)) wydajność z) toStream.Jak przepisać wyjście dla pętli for na wyjście Stream?

Każda rada jest doceniana. Inne rozwiązanie, na które patrzę, to zwrócenie wyniku, gdy zostanie znaleziony. Dzięki temu rozwiązaniu prawdopodobnie zwróciłem tylko jeden wynik. Dzięki

isConflictAt(xs.updated(pos, 0), pos, xs(pos) jest funkcją sprawdzania ograniczeń.

def solve(xs : List[Int], pos: Int): Stream[List[Int]] = { 
    if (!isConflictAt(xs.updated(pos, 0), pos, xs(pos))) { 
     val pos = xs.indexOf(0) 
     if (pos < 0) {println(xs); Stream(xs) } else (for (i <- 1 to 9; z <- solve(xs.updated(pos, i), pos)) yield z) toStream 
    } else Stream.empty 
    } 

Odpowiedz

10

for (i <- 1 to 9; z <- solve(???)) yield z oznacza (1 to 9).flatMap{i => solve(???)}. Zobacz this answer.

Aby wygenerować leniwy wynik, należy dokonać leniwego źródła (1 to 9) przy użyciu (1 to 9).view lub (1 to 9).toStream.

Spróbuj tego:

scala> def solve(pos: Int): Stream[List[Int]] = { 
    | println(pos) 
    | Stream.fill(3)((1 to pos).map{ _ => util.Random.nextInt}.toList) 
    | } 
solve: (pos: Int)Stream[List[Int]] 

scala> for{ 
    | i <- (1 to 9).toStream 
    | z <- solve(i) 
    | } yield z 
1 
res1: scala.collection.immutable.Stream[List[Int]] = Stream(List(-1400889479), ?) 

scala> res1.force 
2 
3 
4 
5 
6 
7 
8 
9