関数型プログラミングとは、演算の問題を解決するために関数の適用を重要視したプログラミングスタイルです。これは状態の遷移や連続したコマンドの実行を重要視した命令型プログラミングとは対象的です。もし関数だけのプログラミング言語を使用したいならHaskellなどを考慮すべきでしょう。しかしGroovyが好きで、関数的なスタイルのマジックを適用させてみたいのであれば、読み進めてください。
関数の基本
例えば、次のような階乗の関数のような関数を定義するのに、命令型のステップを何も含まないGroovyの(Javaのような)関数を使用することができます。
Groovyでは return 文を省くことができるので(最後に評価された値がデフォルトの戻り値となる)、若干のシンタックスシュガー(楽な書き方)をJavaに加えます。
もちろん次のクイックソートの例のように関数型と命令型のコーディングスタイルを混ぜて調和させることから始めることもできます。
カリー関数
次のようにcurry()メソッドを使うことでクロージャインスタンスに対して1つ以上の引数を固定することができます。
curry() メソッドに1つの引数を与えた場合、最初の引数が固定されます。 N 個の引数を与えた場合 1..N の引数が固定されます。詳しくは参考資料 1. もしくは GINA の5章を参照してください。
遅延評価
特定のメリットがある関数型プログラミングのひとつの特定のスタイルは、遅延評価を利用することです。これによって際限のない構造を定義することができ(次の項を参照)、ある種の問題をたいへん効果的に解決する方法を考案でき、別の方法では難しい問題に対してエレガントな解決策を思いつくようになります。既にGroovyのいくつかの部分でこのスタイルを利用しているということは朗報であり、それらはたいていが難しいものを隠してくれているので、あなたが得をしてもどんな魔法が起きたのかを知らなくてもいいのです。以下にいくつか例を挙げます。
XmlSlurperは任意のGPath式が作られることを許容します。あなたは式を作ると、XMLノードをpullしてあなたの式が求めるものにマッチするリストに出し入れしているその裏側では、XMLパースが継続していると思うかもしれません。でもそれは違います。代わりに、あなたのGPathの遅延した評価が蓄えられているのです。最終的なGPathの結果を評価する必要が出たときに、式の結果の値を決定するために必要なものを計算します。(XmlSlurperに関する更なる情報にはGINAの12章を参照してください。)- Groovyの
DataSet機能はRDBに格納されたデータを操作します。 datasetクエリーを作っても、裏では何も接続も操作も発生しません。要求された結果を返すためSQLのトラフィックが最小になるように最適化されたのクエリーが、結果が必要になったときに初めて実行されます。 [DataSetに関する更なる情報にはGINAの10.2項を参照してください。]
際限のない構造
すべての詳細には下の参考資料 2.を見てください。付け加えて言うなら、まず最初にいくつかのListをハンドリングする関数を定義しなければなりません。それから際限のないストリームを定義して使うことができます。
詳細情報
こちらも参照してください:
- Practically Groovy: Functional programming with curried closures
- Infinite Streams in Groovy
- Functional Programming Languages
- Why Functional Programming Matters
- Functional programming in the Java language
- Post on functional programming in Java - maybe a tad verbose
- FunctionalJ - A library for Functional Programming in Java
- Weak versus strong languages, who wins the fight?
- Programming Languages:Application and Interpretation
- Beyond Groovy 1.0: Groovy goes Lisp