Statistical Programming

reduceとfold…

例えばこんなコレクションがあったとして

List(1,2,3,4,5)

このコレクションの各要素に10を足したものを掛け合わしたいとする。
そんなとき便利なのかreduce系もしくはfold系メソッド。
例えばreduceLeft(f)メソッドは,リスト x1, x2, …, xn に対して

f(f(…f(f(x1, x2), x3), …), xn) 
n=4 の場合は,f(f(f(x1, x2), x3), x4)

となる。
逆にreduceRight(f)は,リスト x1, x2, …, xn に対して

f(x1, f(x2, … f(xn-1, xn)…)) 
n=4 の場合は,f(x1, f(x2, f(x3, x4)))

翻ってfoldLeft(e)(f)は,リスト x1, x2, …, xn に対して

f(f(…f(f(f(e, x1), x2), x3), …), xn) 
n=4 の場合は,f(f(f(f(e, x1), x2), x3), x4)

まあ再帰を使ってもいいけど。

def mul(in:List[Int]):Int=in match{
    case Nil=>0
       case List(x)=>x+10
       case x::tail=>(x+10)*mul(tail)
     }

でも早くて簡潔な方がいいよね!

reduce((a,b)=>(a+10)*(b+10))
fold(10)((a,b)=>(a+b)

foldとreduceの違いは最初の要素に対する処理が違うのかな…
reduceの場合強制的に最初の要素とその次の要素が処理されるのに対してfoldはその前にひと呼吸置けるというか最初の要素とその次の要素が処理される前に自分が追加した引数と最初の要素をまず処理してからその後の処理にいくってかんじか。
だからfoldの場合その最初の処理の片割れ(もう一方はコレクションの最初の要素)追加してあげなきゃいかんのね。