Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 30 Next »


関数型プログラミングはコンピュータで問題解決するために関数の機能の活用を強調するプログラミングスタイルです。これは状態変化を強調し、逐次コマンドを実行する命令型プログラミングとは対照的です。もしあなたが関数のみのプログラミング言語を利用したいのであれば、Haskellを検討してみてはいかがでしょうか。しかしそれでもGroovyが好きで、少しでも関数スタイルの魔法を適用させたいのであれば、読み進めて下さい。

関数型の基礎


Groovyの関数(Javaのような) は命令ステップを一切含まぬよう宣言することができます。例えばこのような関数です。


Groovyでは、 return 文を省略できる(最後に評価された式がデフォルトの戻り値となります)という微量のシンタクスシュガーがJavaに加えられています。


上記の階乗関数はクロージャを使って宣言することもできます。


最後の行に見えるように、このクロージャ版はメソッドと同様の方法で呼び出されています(ですが、 fac2.call(4) という長い書き方もサポートされています)。クロージャ版は fac2 をClosureパラメータとして渡したり、データ構造に埋め込んだりできるといった利点があります。


関数とクロージャは変換することもできます。例えば、


fac3 変数もまたクロージャとなります。


もちろん次のクイックソートの例のように関数型と命令型のコーディングスタイルを混ぜて調和させることから始めることもできます。

カリー関数


次のようにクロージャのインスタンスに対してcurry()メソッドを使うことで一つ以上の引数の値を固定することができます。


もし、 curry() メソッドに引数を一つ与えると、最初の引数を固定します。もし、引数を N 個与えると、 1からN の引数を固定します。詳細はGINAの1章、もしくは5章を参照して下さい。

遅延評価


関数型プログラミングを利用するメリットの一つは遅延評価を使用することです。これは無限の構造の宣言を許可し(次の章をご覧下さい)、いくつかの問題の特に効果的な解決法をひねり出したり、別のとてもエレガントな解決法を思いつかせてくれます。幸いなことに、Groovyはこれらのいくつかをスタイルを既に使うことができ、典型的な難しい部分は包み隠してくれるので、あなたの代わりにどんな魔法が裏で使われているのかを知る必要がありません。以下はいくつかの例です。


XmlSlurper は任意のGPath式が作られることを許容します。あなたは式を作ると、XMLノードをpullしてあなたの式が求めるものにマッチするリストに出し入れしているその裏側では、XMLパースが継続していると思うかもしれません。でもそれは違います。代わりに、あなたのGPathの遅延した評価が蓄えられているのです。最終的なGPathの結果を評価する必要が出たときに、式の結果の値を決定するために必要なものを計算します。(XmlSlurperに関す る更なる情報にはGINAの12章を参照してください。)


Groovyの DataSet 機能はRDBに格納されたデータを操作します。 datasetクエリーを作っても、裏では何も接続も操作も発生しません。要求された結果を返すためSQLのトラフィックが最小になるように最適化されたクエリーが、結果が必要になったときに初めて実行されます。 [DataSetに関する更なる情報にはGINAの10.2項を参照してください。]

無限の構造


すべての詳細には下の参考資料 2.を見てください。付け加えて言うなら、まず最初にいくつかのListをハンドリングする関数を定義しなければなりません。それから際限のないストリームを定義して使うことができます。


もしあなたが、cons, car, cdr のような伝統的な関数型プログラミングの用語に慣れ親しんでいないなら、リファクタリングして少し読みやすくしたバージョン(Alexander Kriegisch)はいかがでしょうか。

Functional Javaを使用する


関数型プログラミングをサポートしているJavaライブラリの利用も考慮に入れることができます。例えば、Functional Javaを使用して、上記で示した偶数の例はこのようになります。


もうちょっとだけ大胆にしてみましょう、素数の計算を考えます。


functionaljava.jarをクラスパスに追加するのを忘れないようにして下さい。バージョン2.8以上のFunctional Javaが必要です。


もう一つの例。


もう少しメタプログラミングっぽく。


上記の例はこのように書き直すことができます。

詳細情報


こちらも参照してください。

  1. Practically Groovy: Functional programming with curried closures
  2. Infinite Streams in Groovy
  3. Functional Programming Languages
  4. Why Functional Programming Matters
  5. Functional programming in the Java language
  6. Post on functional programming in Java - maybe a tad verbose
  7. FunctionalJ - A library for Functional Programming in Java
  8. Weak versus strong languages, who wins the fight?
  9. Programming Languages:Application and Interpretation
  10. Beyond Groovy 1.0: Groovy goes Lisp
  11. Concurrency with Groovy
  • No labels