Scalaでストリームを実装する
scala では基本的に式は正格評価されます。 評価を遅らせたい場合は、サンク(thunk)と呼ばれる関数にしてあげることになります。 単純な例から見てみてみましょう。
scala> 1 res4: Int = 1 scala> def one = () => 1 one: () => Int scala> one() res6: Int = 1
このようにある A 型の値をサンクにしたい場合は () => A 型の関数にしてあげればよいです。 評価したくなったタイミングで関数にユニット () を渡してあげる形になります。
特に関数定義の際に引数の評価を遅らせたいことがあると思います。 以下のように数字を 2 倍する関数を定義できます。
scala> def twice(x: () => Int) = 2 * x() twice: (x: () => Int)Int scala> twice(() => 2) res: Int = 4
この場合、呼び出し側と実装部分で () を付けるのが面倒なのですが、 x とだけ書けば良いように、便利な...
Read More