Streamの作成については、半年前くらいに記事にまとめた。リストの操作と無駄な中間リストリストへのmapやfilter操作の評価は、模式的には以下のような感じで行われる。3)List(36,42)中間リストが無駄に生成されているので、mapやfilterといった高階関数をつかって合成性をおとさずに、つまりwhileループに頼らずなんとかしたい。そんなときに非正格性(non-strictness)を使うとよい。いうことで「ワンランク上のリストの構築のしかた」を探っていく。「ワンランク上のリスト構築」をする前に正格性について確認を行っておく。正格性とは関数の特性である。非正格関数では、引数の1つ以上を評価しないという選択が可能で、正格関数では引数が常に評価される。制御構造は非正格の一例。ステートメントが評価されない。getFoo()正確には、条件パラメータについては常に正格であり、各条件分岐後のステートメントは非正格である。Scalaで非正格関数を記述するためには、引数の一部を評価されない状態で受け取ればよい。具体的には以下のようにできる。onFalse()評価されない式をサンクとよぶ。これを評価するためには、空の引数リストを渡せばよい。型のシンタックスシュガーになっている。関数はさらに簡単に以下のように書ける。onFalseどちらの構文においても、評価されずに渡される引数は、関数の本体ないで参照されている場所ごとに毎回評価される。キーワードを使って値を明示的にキャッシュすればよい。2遅延リストを作る非正格にする方法はわかっているので、あとはリストでやったことに手を加えてやれば良い。データ構造の定義は以下のとおり。Stream[A]これを用いて、冒頭で示したリストへの操作の効率化を図っていくことを考える。コンストラクタに潜む非効率性Consデータコンストラクタを直接呼び出した場合、評価が無駄に走ることがある。Some(12)無駄な処理を減らすためにはキャッシュをさせてやればよい。以下のようにスマートコンストラクタを定義する。スマートコンストラクタには型推論を助ける狙いもある。これらを用いると以下のようにできる。評価がどうされるかを最後に確認しておく。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。