Como criar lista do intervalo
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.
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)