No Programming, No Life

プログラミング関連の話題や雑記

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でも好きなだけ右から畳み込めますよ!!