2009-09-11 4 views
11

私は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 :: Nilcrossedがのインスタンスではないことを意味し、sieve_coreの最初の繰り返しに一致していますリスト。

は私が List[Int]lstパラメータの種類を変更し、現在のコードは、エラーでコンパイルされません。

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

はどうやらRangeListではありません。

質問:範囲をリストにするにはどうすればよいですか?それとも、私のコードで大きな問題になっているのですか?途中で何らかの悪い仮定をしましたか?

助けてください。

答えて

28

範囲を取り、返しListコンパニオンオブジェクト上のapply方法がありますList

便利 Listファクトリメソッド in the List collection documentationがたくさんある
scala> List.range(2, 11) 
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10) 

+0

Listクラスapidocsをチェックしましたが、Listオブジェクトdocsをチェックしていません。今私はよく知っている。ありがとう。 –

+2

あなたは知っている、それは彼らが目立ってお互いにリンクされていないか、または単一のページに結合されていない方法は非常に迷惑です:) –

+2

これは廃止されるはずです、私は言われました。 '2 to max toList'が動作します。 –

7

私はdigitalrossはしかし、この場合には、より効率的であると確信してs.toList

を使用し、リストの中に任意の順序sをオンにします。

+0

実際、これはScala Way +1 – DigitalRoss

関連する問題