Pregunta

Soy nuevo en Scala, recién comencé a aprender, así que esta es una pregunta básica para principiantes.

Intento implementar el algoritmo Tamiz de Eratóstenes . Esto es lo que obtuve hasta ahora:

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

El resultado es:

List(2)

Por lo que yo entiendo, case _ = > cross :: Nil coincide en la primera iteración de sieve_core , lo que significa que cruzado no es una instancia de una Lista.

Cambié el tipo de parámetros de lst a List [Int] y ahora el código no se compilará con un error:

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

Aparentemente, Range no es una List .

Pregunta: ¿Cómo puedo convertir el rango en una lista? ¿O es un problema mayor con mi código? He hecho algunas suposiciones erróneas en algún lugar del camino?

Cualquier ayuda apreciada.

¿Fue útil?

Solución

Hay un método apply en el objeto complementario List que toma un rango y devuelve una List :

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

Hay muchos métodos de fábrica List útiles en la documentación de la colección List .

Otros consejos

Para convertir cualquier secuencia s en una lista, use s.toList

Estoy seguro de que digitalross 'es más eficiente en este caso, sin embargo.

(2 a max) no es un scala.collection.immutable.List de hecho, pero a scala.collection.immutable.Range , más precisamente una instancia de scala.collection.immutable.Range.Inclusive , como se menciona en su mensaje de error. De pasada, tenga en cuenta que Inclusive y Exclusive son miembros de Range , con un significado bastante autoexplicativo.

Afortunadamente, la clase de rango ofrece el método práctico toList , que puede aprovechar para convertir el rango en una lista y resolver el problema, como en el siguiente fragmento de código:

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top