0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 遅延評価の仕組み
  2. LazyListを構築する
  3. 無限ストリーム
  4. 遅延的な取得とフィルタリング
← Scala for Backend Engineering & Functional Programmingに戻る