题
我是Scala的新手,刚刚开始学习,所以这是一个基本的初学者问题。
我尝试实施 Sieve of Eratosthenes 算法。这是我到目前为止所得到的:
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
不是List的实例。
我将 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转换为List?或者我的代码是一个更大的问题,我在某个地方做了一些不好的假设?
任何帮助表示感谢。
解决方案
在 List
伴侣对象上有一个 apply
方法,该方法取一个范围并返回 List
:
scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
有许多有用的 List
工厂方法 List 集合文档中的$“rel =”noreferrer“>。
其他提示
要将任何序列 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)
不隶属于 StackOverflow