Domanda

Sono nuovo di Scala, ho appena iniziato a studiare, quindi questa è una domanda di base per principianti.

Cerco di implementare l'algoritmo Sieve of Eratosthenes . Ecco cosa ho ottenuto finora:

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))

Il risultato è:

List(2)

Per quanto ho capito, case _ = > cross :: Nil viene associato nella prima iterazione di sieve_core , il che significa che cross non è un'istanza di un Elenco.

Ho cambiato il tipo di parametri lst in Elenco [Int] e ora il codice non verrà compilato con un errore:

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

Apparentemente Range non è un List .

Domanda: come posso trasformare Range in un Elenco? O è un problema più grande con il mio codice, ho fatto qualche brutta ipotesi da qualche parte lungo la strada?

Qualsiasi aiuto apprezzato.

È stato utile?

Soluzione

Esiste un metodo apply sull'oggetto associato List che accetta un intervallo e restituisce un List :

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

Esistono molti List metodi di fabbrica utili nella List documentazione sulla raccolta .

Altri suggerimenti

Per trasformare qualsiasi sequenza s in un elenco, usa s.toList

Sono sicuro che digitalross 'sia più efficiente in questo caso, tuttavia.

(da 2 a max) non è un scala.collection.immutable.List in effetti, ma un scala.collection.immutable.Range , più precisamente un'istanza di scala.collection.immutable.Range.Inclusive , come menzionato nel tuo messaggio di errore. Solo di sfuggita notate che Inclusive e Exclusive sono essi stessi membri di Range , con un significato abbastanza autoesplicativo.

Fortunatamente la classe Range offre il pratico metodo toList , che puoi sfruttare per convertire l'intervallo in un elenco e risolvere il problema, come nel seguente frammento di codice:

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top