Groovyでfoldl, foldrを書いてみた
はじめに
最近関数型言語をよく目にする機会が増えたので、Groovyでは#inject(左畳み込み)はあるけど、そういえば右畳み込みがないんじゃない?と思ってCollectionを拡張してみました。
ソース (動作確認: Groovy Version: 1.7.5 JVM: 1.6.0_20)
解説
metaclass.defineでクラスを拡張しています。
foldlはそのまま#injectを呼び出してるだけです。foldrは最初は再起で定義しようとしたんですが、なぜか怒られるので仕方なくwhileなど泥臭く実装しております。
引数の順番について
Haskellみたく
foldl (+) 1 [2, 3, 4] -- foldl 関数 初期値 リスト
のような引数の順番にするか迷ったんですが、ここはやはりGroovyなので#injectに合わせて
collection.foldl(0){ x, y -> x + y } // #foldl(初期値) クロージャ
みたいな形にしてあります。
これでGroovyでも好きなだけ右から畳み込めますよ!!