Pergunta

Eu sou novo para Scala, só comecei a aprender, por isso esta é questão básica iniciante.

Eu tento implementar Crivo de Eratóstenes algoritmo. Aqui está o que eu tenho até agora:

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

O resultado é:

List(2)

Tanto quanto eu entendo, case _ => cross :: Nil é correspondida em primeira iteração do sieve_core, o que significa que crossed não é uma instância de uma lista.

Eu mudei tipo parâmetros lst para List[Int] e agora o código não irá compilar com um erro:

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

Aparentemente Range não é um List.

Pergunta: como posso transformar Gama em uma lista? Ou é algum problema maior com o meu código, eu ter feito algum lugar suposição ruim ao longo do caminho?

Qualquer ajuda apreciado.

Foi útil?

Solução

Há um método apply no objeto List companheiro que tem um intervalo e retorna um List:

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

Existem muitos métodos de fábrica List útil na documentação coleção List .

Outras dicas

Para transformar qualquer s seqüência em uma lista, use s.toList

Eu tenho certeza digitalross' é mais eficiente neste caso, no entanto.

(2 to max) não é uma scala.collection .immutable.List , mas na verdade um scala.collection.immutable.Range , mais precisamente uma instância de scala.collection.immutable.Range.Inclusive, conforme mencionado na sua mensagem de erro. Apenas de passagem, nota que Inclusive e Exclusive são eles próprios membros de Range, com um significado bastante auto-explicativo.

Felizmente classe Range ofertas a calhar toList método, que você pode aproveitar para converter o intervalo em uma lista e resolver o problema, como no seguinte trecho 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top