foldLeft と foldRight のエイリアス

foldLeft

初期値を1として、arrの和を得る。

val arr = List(2, 3, 4)
arr.foldLeft(1){(x, y) => x + y}

1 + 2 + 3 + 4 で 10 となる。

短く書くと、

arr.foldLeft(1)( _ + _ )

foldLeft には /: というエイリアスがあり、以下のように書ける。

(1 /: arr){_ + _}

foldRight

foldRight では適用の順番が逆になる。

val arr = List(2, 3, 4)
arr.foldRight(1)( _ + _ )

4+1 3+(4+1) 2+(3+(4+1)) の順番で適用される。


foldRight は :\ というエイリアスがあり、以下のように書ける。

(arr :\ 1){_ + _}

foldLeft の /: とは引数の位置が逆になる。末尾から初期値の1が適用されるのが分かりやすい形ですね。


foldLeft と foldRight の戻り値

foldLeft の定義は以下のようになっており、最初の引数の型が戻り値の型となる。

foldLeft[B](z : B)(op : (B, A) => B) : B

なので、以下のようにすると、結果として文字列が得られる。

val arr = List(2, 3, 4)
arr.foldLeft("1")( _ + _ )  // 1234
arr.foldRight("1")( _ + _ ) // 2341

明示的に書くなら以下のように書ける。

arr.foldLeft[String]("1")( _ + _ )
arr.foldRight[String]("1")( _ + _ )

エイリアスを使うとこう。

("1" /: arr){_ + _}
(arr /: "1"){_ + _}