ScalaでProject Euler(13)

Problem 6

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
})