Как создать список из диапазона
Вопрос
Я новичок в Scala, только начал изучать, так что это основной вопрос для начинающих.
Я пытаюсь реализовать Сито Эратосфена . Вот что я получил до сих пор:
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))
Результат:
List(2)
Насколько я понимаю, case _ = > cross :: Nil
сопоставляется на первой итерации sieve_core
, что означает, что cross
не является экземпляром списка.
Я изменил тип параметров lst
на List [Int]
, и теперь код не будет компилироваться с ошибкой:
(fragment of Problem3.scala):24: error: type mismatch; found : Range.Inclusive required: List[Int] sieve_core(2, (2 to max)) ^
Очевидно, Range
не является списком
.
Вопрос: как я могу превратить Range в список? Или это большая проблема с моим кодом? Я сделал неверное предположение где-то по пути?
Любая помощь приветствуется.
Решение
В сопутствующем объекте List
есть метод apply
, который принимает диапазон и возвращает List
:
scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
Существует множество полезных фабричных методов List
в документации по списку
.
Другие советы
Чтобы превратить любую последовательность s
в список, используйте s.toList
Я уверен, что digitalross 'более эффективен в этом случае.
(от 2 до макс.)
не является scala.collection.immutable.List действительно, но scala.collection.immutable.Range , точнее - экземпляр scala.collection.immutable.Range.Inclusive
, как упоминалось в вашем сообщение об ошибке. Просто мимоходом отметим, что Inclusive
и Exclusive
сами являются членами Range
, с довольно автоматическим объяснением.
К счастью, класс Range предлагает удобный метод toList
, который можно использовать для преобразования диапазона в список и решения проблемы, как в следующем фрагменте кода:
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)