2013-04-04 5 views
6

Ich habe versucht, diese Scala-Funktion zu konvertieren, um einen Lazy Stream zurückzugeben, anstatt alle Ergebnisse eifrig abzurufen und sie von einem Seq in Stream zu konvertieren, wenn alle Ergebnisse vorhanden sind. Ich habe das Gefühl, das Problem liegt in (für (i < - 1 bis 9; z < - lösen (xs.updated (pos, i), pos)) Ausbeute z) toStream.Wie schreibt man eine For-Loop-Seq-Ausgabe in die Stream-Ausgabe um?

Jeder Rat wird geschätzt. Eine andere Lösung, die ich betrachte, ist, ein Ergebnis zurückzugeben, wenn es gefunden wird. Mit dieser Lösung habe ich wahrscheinlich nur 1 Ergebnis zurückgegeben. Danke

isConflictAt(xs.updated(pos, 0), pos, xs(pos) ist eine Bedingungsprüfung Funktion.

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 
    } 

Antwort

10

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

Um faule Ergebnisse zu erzeugen, sollten Sie die Quelle (1 to 9) mit (1 to 9).view oder (1 to 9).toStream faul machen.

Versuchen Sie folgendes:

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 
Verwandte Themen