私の質問を例で明確にしましょう。これは、Scala で末尾再帰を使用して記述された標準的な累乗アルゴリズムです。
def power(x: Double, y: Int): Double = {
def sqr(z: Double): Double = z * z
def loop(xx: Double, yy: Int): Double =
if (yy == 0) xx
else if (yy % 2 == 0) sqr(loop(xx, yy / 2))
else loop(xx * x, yy - 1)
loop(1.0, y)
}
ここでsqr
は、 メソッドを使用して の結果の 2 乗を生成しloop
ます。このような単純な操作のために特別な関数を定義するのは、良い考えとは思えません。loop(..) * loop(..)
しかし、計算が 2 倍になるので、代わりに書くことはできません。
val
関数の有無にかかわらずそれを書くこともできsqr
ます:
def power(x: Double, y: Int): Double = {
def loop(xx: Double, yy: Int): Double =
if (yy == 0) xx
else if (yy % 2 == 0) { val s = loop(xx, yy / 2); s * s }
else loop(xx * x, yy - 1)
loop(1.0, y)
}
sqr
を使用しているため、 を使用したバリアントよりも見栄えが良いとは言えませんstate variable
。最初のケースはより機能的で、2 番目の方法はより Scala に適しています。
とにかく、私の質問は、関数の結果を後処理する必要がある場合の対処方法です。たぶん、Scalaにはそれを達成するための他の方法がありますか?