質問
私は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
は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
ではありません。
質問:範囲をリストにするにはどうすればよいですか?それとも私のコードに大きな問題がありますか?途中で何らかの悪い仮定を立てましたか?
ご協力ありがとうございます。
解決
List
コンパニオンオブジェクトには apply
メソッドがあり、範囲を取得して List
を返します:
scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
多くの便利な List
ファクトリメソッドがあります List
コレクションドキュメント内。
他のヒント
任意のシーケンス s
をリストに変換するには、 s.toList
ただし、この場合はdigitalrossの方が効率的であると確信しています。
(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)