私があなたの質問を正しく解釈するなら、あなたはこれをしたい:
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 3
にex
なり、 でリストを取得できます(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