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"){_ + _}