LazyListを構築する
遅延シーケンスを構築します。
「LazyListを構築する」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
構築の基本
LazyListを構築する方法はいくつかあります。最も簡単なのは、Listを構築する場合と同じapplyファクトリです。
ただし、本当の力を発揮するのは末尾を遅延させるコンストラクターです。このレッスンで詳しく見ていきます。
val ll = LazyList(10, 20, 30)
println(ll.head)空のLazyList
LazyList.emptyは終端であり、Nilに相当する遅延版です。有限のLazyListはすべてこれで終わります。
#::で要素を先頭に追加するときの基底ケースとして使用します。
object Demo extends App {
val empty = LazyList.empty[Int]
println(empty.isEmpty)
println(empty.toList)
}#::による先頭への追加
#::演算子は、先頭要素を名前渡しの末尾にconsします。リストは右から左へ構築し、最後をLazyList.emptyにします。
#::は末尾を遅延的に受け取るため、先頭より後ろの部分は評価を強制するまで構築されません。
object Demo extends App {
val ll = 1 #:: 2 #:: 3 #:: LazyList.empty
println(ll.toList)
}遅延性を観察する
末尾に副作用を入れて、それがいつ実行されるかを確認してみましょう。末尾の評価を強制したときだけ、副作用が発生します。
これを実行すると、LazyListを定義したときではなく、2番目の要素にアクセスした後にだけ"building tail"が表示されます。
object Demo extends App {
val ll = 1 #:: { println("building tail"); 2 #:: LazyList.empty }
println("defined")
println(ll.head)
println(ll(1))
}consを明示的に使用する
内部では、#::はLazyList.consです。consでは先頭と末尾の両方が名前渡しになるため、評価を完全に制御できます。
これは再帰的なジェネレーターを定義するときに便利です。
val ll = LazyList.cons(1, LazyList.cons(2, LazyList.empty))
println(ll.head)再帰的なジェネレーター
LazyListは自分自身を参照できます。先頭を生成し、末尾では自分自身を再帰的に呼び出す関数を定義します。
末尾は名前渡しであるため、再帰が無限に実行されることはありません。各セルが要求されるまで停止します。
def countFrom(n: Int): LazyList[Int] =
n #:: countFrom(n + 1)
println(countFrom(5).take(3).toList)ジェネレーターを実行する
自己参照するジェネレーターを実行し、いくつかの値を取り出してみましょう。takeによって、評価を強制するセルの数を制限できます。
takeがなければ無限ループになるため、無限ジェネレーターを評価するときは必ず上限を設定してください。
object Demo extends App {
def countFrom(n: Int): LazyList[Int] =
n #:: countFrom(n + 1)
println(countFrom(1).take(5).toList)
}Iteratorからの構築
既存のコレクションやイテレーターをラップすることもできます。LazyList.from(start)は無限の連番を構築し、someList.to(LazyList)はすでに把握しているデータを変換します。
これらを使うと、すでにあるデータや記述可能なデータを遅延ビューとして扱えます。
object Demo extends App {
val ll = List(1, 2, 3).to(LazyList)
println(ll.map(_ * 2).toList)
}LazyList.iterate
LazyList.iterate(seed)(f)は、前の要素にfを繰り返し適用して、次の各要素を構築します。
これは、2の累乗のようにステップ規則で定義されるシーケンスを簡潔に表現する方法です。
object Demo extends App {
val powers = LazyList.iterate(1)(_ * 2)
println(powers.take(6).toList)
}LazyList.continually
LazyList.continually(expr)は、式を要素ごとに再評価しながら無限に繰り返します。定数ストリームやランダムなストリームに便利です。
takeと組み合わせると、有限の一部分を取得できます。
object Demo extends App {
val zeros = LazyList.continually(0)
println(zeros.take(4).toList)
}コンストラクターの選択
固定された小さなリストにはapply、手書きの再帰には#::またはcons、ステップ規則にはiterate、連番の生成にはfrom、繰り返しにはcontinuallyを使用してください。
これらはすべて末尾を遅延させるため、選択の基準は表現のしやすさです。
理解度チェック
LazyListの構築についての理解度を確認してください。
まとめ
apply、empty、#::/cons、iterate、from、continuallyを使ってLazyListを構築しました。
名前渡しの末尾により、自己参照する無限になる可能性のあるジェネレーターも安全に定義できます。次はこれを活用して、本当に無限のストリームを作成します。
よくある質問
「LazyListを構築する」レッスンは無料ですか?
はい。「LazyListを構築する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「LazyListを構築する」で何を学びますか?
遅延シーケンスを構築します。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「LazyListを構築する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 遅延評価の仕組み
- LazyListを構築する
- 無限ストリーム
- 遅延的な取得とフィルタリング