2

整数で定義されたリストのリストがあります:

val ex: List[List[Int]] = List(List (1, 2, 3), List(4, 5, 6), List(7, 8 , 9), ex)

scalaで循環定義を使用して、リストのリストのすべての要素を2倍するにはどうすればよいですか?

編集:エンティティXの循環定義は、Xを効果的に使用して自分自身をXに設定する定義です。

例:

val ex1: List[List[Int]] = List(List(1,2,3), <call ex1 to multiply the elements by two>)

この例では、無限のリストのリストを作成します。事前に明確にしなかったことをお詫び申し上げます。

ありがとうございました!

4

3 に答える 3

3

よくわかりませんが、遅延定義されたリストのようなストリームを探しているのではないかと思います。その定義は再帰的になる可能性があります。これはあなたが望むもののように見えますか?

scala> val ex:Stream[List[Int]] = List(1,2,3) #:: ex.map( _ map (_*2) )
ex: Stream[List[Int]] = Stream(List(1, 2, 3), ?)

scala> ( ex take 5 ) foreach println
List(1, 2, 3)
List(2, 4, 6)
List(4, 8, 12)
List(8, 16, 24)
List(16, 32, 48)

多分

scala> val ex:Stream[List[Int]] = List(1,2,3) #:: ex.map( _ map (_+3) )
ex: Stream[List[Int]] = Stream(List(1, 2, 3), ?)

scala> ( ex take 5 ) foreach println
List(1, 2, 3)
List(4, 5, 6)
List(7, 8, 9)
List(10, 11, 12)
List(13, 14, 15)
于 2012-10-20T05:12:02.503 に答える
1

私があなたの質問を正しく解釈するなら、あなたはこれをしたい:

val ex: List[List[Int]] = {
  val ex = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
  ex ++ ex
}

これは循環定義ではありません。これは、内側exが外側の定義を隠しているだけだからです (また、別の変数名を使用するとより明確になります)。

実際に再帰的な定義が必要な場合は、次のような遅延データ構造を使用する必要がありますStream( で試すことListができますが、 が得られますNullPointerException)。したがって、これを書くことができます:

val ex: Stream[List[Int]] = 
  Stream(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)) #::: (ex take 3)

ex.toList // if it actually needs to be a List, which is probably doesn't

#:::onの遅延Stream版です。:::List

exではなく追加すると無限ex take 3exなり、 でリストを取得できます(ex take 6).toList

編集:あなたの質問の@AmigoNicoの解釈(おそらく正しい解釈ですが、誰が知っていますか!)を読んだ後、iterate関数を使用してこれを行うこともできます。

List.iterate(List(1,2,3), 3)(_ map (_ * 2))
  // List(List(1, 2, 3), List(2, 4, 6), List(4, 8, 12))

// or if you want it infinte:
val xs = Stream.iterate(List(1,2,3))(_ map (_ * 2))
(xs take 3).toList
  // result same as above
于 2012-10-20T00:56:05.033 に答える
0
  1. List無限は Scala の遅延データ構造ではなく、必然的にメモリ不足になるため、無限にすることはできません。しかし、Scala には遅延構造があります -Stream
  2. あなたが探しているのはiterate関数です。標準ライブラリには欠けているため、 Haskellに触発された実装を次に示します (Scala 2.10 を使用していると仮定します)。

    implicit class AnyFunctional [ A ] ( val a : A ) extends AnyVal {
      def iterate ( f : A => A ) : Stream[A] = a #:: (f(a) iterate f)
    }
    

    それをスコープに入れると、次のように使用できます。

    scala> List(1,2,3) iterate (_.map(_*2)) take 3 toList
    warning: there were 1 feature warnings; re-run with -feature for details
    res7: List[List[Int]] = List(List(1, 2, 3), List(2, 4, 6), List(4, 8, 12))
    
于 2012-10-19T23:38:30.270 に答える