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表記、ただし有限リストを想定)