Scalaでflip+fold(L|R)

flip(2引数関数の引数を逆転させる高階関数)がすぐに見つからなかったので書いてみた。
foldLeft, foldRightで使えるのでは?と思って実験。

object Flip {
  def main(args : Array[String]) : Unit = {
    val list = List("恋しさ", "せつなさ", "心強さ")
    def toto[A,B](a : A, b : B) : String = a + "と" + b

    println(list.foldRight("")(toto))
    //type parameter
    println(list.foldLeft("")(flip2(toto[String,String])))    
    //anonymous function
    println(list.foldLeft("")(flip2(toto(_, _))))
    //may be easier
    println(list.reverse.foldRight("")(toto))
  }
  
  def flip[A,B,C](f : A => B => C) : B => A => C = b => a => f(a)(b)
  def flip2[A,B,C](f : (A, B) => C) : (B, A) => C = (b, a) => f(a, b)
}

実行結果

恋しさとせつなさと心強さと
心強さとせつなさと恋しさと
心強さとせつなさと恋しさと
心強さとせつなさと恋しさと

totoを多相型にしたら型パラメータが必要で
あまり使いやすくないかも、と思ってしまった。
アンダースコアで無名関数にしても今ひとつ。
上の例では、reverseした方がわかりやすいかも。

foldl (flip op) e = foldr op e . reverse

である。(Haskell表記、ただし有限リストを想定)