val N = 100 val s = (1 to N).sum val s2 = (1 to N).map((n) => n * n).sum println (s * s - s2)
これでもよいですが、fold系を使う方法もあります。
fold系メソッド
自乗和は、
(0 + 1 * 1) + 2 * 2 + ...
と計算できます。これは初期値が必要なので前回のreduceLeftでは求められません。reduceLeftを使うと、
(1 + 2 * 2) + 3 * 3 + ...
となってしまいます。たまたま同じ答えになってしまうのですが。
foldLeftは次のように使います。
val N = 100 val s = (1 to N).sum val s2 = (1 to N).foldLeft(0)((x, y) => x + y * y) println (s * s - s2)
こうじゃないんですね。
val s2 = (1 to N).foldLeft(0, (x, y) => x + y * y)
カリー化されているんでしょうか。
val N = 100 val s = (1 to N).sum val a = (1 to N).foldLeft(0)_ println (s * s - a((x, y) => x + y * y))
うまくいきますね。後ろに_がついているのがうっとうしいですが。
カリー化されているとこういう複雑なこともできます。
println ((1 to 10).foldLeft(0){(x, y) => println (x + y * y) x + y * y })