scala を左傾化させる話

Scala exercises for beginners を foldLeft で解いてみた。

  // Exercise 2
  def sum(x: List[Int]): Int =
    x.foldLeft(0){_ + _}
 
  // Exercise 3
  def length[A](x: List[A]): Int = 
    x.foldLeft(0){(sum, _) => sum + 1}
 
  // Exercise 4
  def map[A, B](x: List[A], f: A => B): List[B] =
    x.foldLeft(identity: List[B] => List[B]){(kacc, h) => racc => kacc(f(h) :: racc)}(Nil)
 
  // Exercise 5
  def filter[A](x: List[A], p: A => Boolean): List[A] =
    x.foldLeft(identity: List[A] => List[A]){(kxs, x) => (if (p(x)) xs => kxs(x :: xs) else kxs)}(Nil)
 
  // Exercise 6
  def append[A](x: List[A], y: List[A]): List[A] =
    x.foldLeft(identity: List[A] => List[A]){(kxs, x) => xs => kxs(x :: xs)}(y)
 
  // Exercise 7
  def concat[A](x: List[List[A]]): List[A] =
    x.foldLeft(identity: List[A] => List[A]){(kxs, x) => xs => kxs(append(x, xs))}(Nil)
 
  // Exercise 8
  def concatMap[A, B](x: List[A], f: A => List[B]): List[B] =
    x.foldLeft(identity: List[B] => List[B]){(kxs, x) => xs => kxs(append(f(x), xs))}(Nil)
 
  // Exercise 9
  /** raise error if the list is empty */
  def maximum(x: List[Int]): Int =
    x.reduceLeft{_ max _}
    //x.foldLeft(Int.MinValue){_ max _}
 
  // Exercise 10
  def reverse[A](x: List[A]): List[A] =
    x.foldLeft(List[A]()){(acc, e) => e :: acc}
  
  def foldRight[A, B](x: List[A], acc: B, f: (A, B) => B): B =
    x.foldLeft(identity: B => B){(kacc, h) => racc => kacc(f(h, racc))}(acc)
参考文献

蛇足ですが、上記文献の fold == 遅延評価版のfoldRight に相当します。「5.1 The foldl」が foldLeft の話です。