Как создать список из диапазона - PullRequest
11 голосов
/ 11 сентября 2009

Я новичок в 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, что означает, что crossed не является экземпляром списка.

Я изменил тип параметров lst на List[Int], и теперь код не будет компилироваться с ошибкой:

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

Видимо Range это не List.

Вопрос: как я могу превратить Range в список? Или это большая проблема с моим кодом, где-то по пути я сделал неверное предположение?

Любая помощь приветствуется.

Ответы [ 3 ]

31 голосов
/ 11 сентября 2009

Для объекта-компаньона List существует метод apply, который принимает диапазон и возвращает List:

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

Существует множество полезных List фабричных методов в документации List .

7 голосов
/ 11 сентября 2009

Чтобы превратить любую последовательность s в список, используйте s.toList

Я уверен, что digitalross 'в этом случае более эффективен.

0 голосов
/ 17 июня 2019

(2 to max) на самом деле не 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...