scalaでは基本的に式は正格評価されます。 評価を遅らせたい場合は、サンク(thunk)と呼ばれる関数にしてあげることになります。 単純な例から見てみてみましょう。

このようにあるA型の値をサンクにしたい場合は () => A 型の関数にしてあげればよいです。 評価したくなったタイミングで関数にユニット () を渡してあげる形になります。

特に関数定義の際に引数の評価を遅らせたいことがあると思います。 以下のように数字を2倍する関数を定義できます。

この場合、呼び出し側と実装部分で () を付けるのが面倒なのですが、 x とだけ書けば良いように、便利な構文が用意されています 以下は上記の twice と同じ関数です。

非常に便利ですね?

そんなこんなでストリームを実装してみます。 簡単に以下のような感じになります。

Stream(1, 2) は以下のように作れます。toList でリスト化できます。

Streamは非正格評価なので、無限に続く数列なんかもつくれちゃいます。 ただし無限列を評価しようとして toList をすると当然ながらスタックオーバーフローが発生します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です