Frage

Ich bin neu in Scala, gerade erst begonnen zu lernen, so ist dies grundlegende Anfänger Frage.

Ich versuche Sieb des Eratosthenes Algorithmus zu implementieren. Hier ist, was ich habe, so weit:

def sieve_core(cross: Int, lst: Seq[Int]): List[Int] = {
    val crossed = lst.filter(_ % cross != 0)
    crossed match {
            case a :: rest => cross :: sieve_core(a, crossed)
            case _ => cross :: Nil
    }
}

def sieve(max: Int): List[Int] = {
    sieve_core(2, (2 to max))
}

println(sieve(100))

Das Ergebnis ist:

List(2)

Soweit ich verstehe, case _ => cross :: Nil in der ersten Iteration von sieve_core abgestimmt ist, was bedeutet, dass crossed nicht eine Instanz einer Liste ist.

Ich änderte lst Parameter Typen List[Int] und jetzt wird der Code mit einem Fehler nicht kompilieren:

(fragment of Problem3.scala):24: error: type mismatch;
 found   : Range.Inclusive
 required: List[Int]
    sieve_core(2, (2 to max))
                      ^

Offenbar Range ist kein List.

Frage: Wie kann ich Bereich in eine Liste machen? Oder ist es etwas größeres Problem mit meinem Code, habe ich habe einige schlechte Annahme, irgendwo auf dem Weg?

Jede Hilfe sehr geschätzt.

War es hilfreich?

Lösung

Es gibt eine apply Methode auf dem List Begleiter Objekt, das eine Reihe nimmt und gibt einen List:

scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)

Es gibt viele nützliche List Factory-Methoden in der List Sammlung Dokumentation .

Andere Tipps

So schalten Sie eine beliebige Folge s in eine Liste, die Verwendung s.toList

Ich bin sicher, digitalross' effiziente in diesem Fall ist, wenn.

(2 to max) ist kein scala.collection .immutable.List in der Tat aber ein scala.collection.immutable.Range , genauer gesagt eine Instanz von scala.collection.immutable.Range.Inclusive, wie in der Fehlermeldung erwähnt. Nur in Kenntnis beiläufig, dass Inclusive und Exclusive ist selbst Mitglieder von Range, mit einer ziemlich Autoerklärend Bedeutung.

Zum Glück ist die Range-Klasse bietet die praktische Methode toList, die Sie zum Umwandeln des Bereichs in eine Liste nutzen können, und lösen Sie das Problem, wie im folgenden Code-Snippet:

scala> val max = 10
max: Int = 10

scala> val r = (2 to max)
r: scala.collection.immutable.Range.Inclusive = Range 2 to 10

scala> val l = r.toList
l: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top