CentreRubyでクロージャ、カリー化(2006.1.28の日記を修正、加筆。関数・クロージャの単位で再利用できるようにするカリー化について。コールバック関数Rubyの話のまえに、クロージャのないC/C++で関数を再利用する方法、その問題点を見ていく。単純なコールバックについて。コールバックといえばqsort()関数。引数として二つの値を比較する関数を渡す。プロトタイプ宣言は、下記のようになっているので、コールバック関数の中でキャストが必要。*));また、コールバック関数をカスタマイズして再利用できない。テンプレート型に対して型を指定して生成した関数オブジェクトのこと。型を指定する点がわずかに似ている。メソッド)を持つオブジェクトで、関数のように扱える。オブジェクトなので、内部状態を持つことができる。下記の例は、関数オブジェクトのクラスIfModZeroを定義している。これで、底が何であってもこのクラスを使える。find_ifなどを提供している。一致するか調べるequalのプロトタイプ宣言。constメソッドを持つオブジェクトを与え、BinaryPredicate型には二つの引数を取る関数呼び出しを持つオブジェクトを与える。C++は、コールバック関数をカスタマイズすることで、再利用可能なようになっている。いちいちクラスを書くのは相当めんどくさい。C++でのファンクタを簡潔にしたもの。関数内部から外側の変数にアクセスできる。Note.C++のクラスは関数内でも定義できるが、そのメソッドから(クラスの外の)関数の自動変数にはアクセスできない。よって生成され、ファンクタと同様、オブジェクトとして扱える。関数呼び出しはcallメソッド。...}でクロージャを生成し、自動的にブロック引数として渡される。Rubyでは、後者の構文によるクロージャの生成を多用する。ある関数があったとして、この関数の仮引数の一部をあらかじめ指定する値で固定し、新しい関数オブジェクトを生成する。新しい関数オブジェクトは引数の数が少なくなる。関数の部分適用ともいう。いう関数に変換することです。ここでカリー化と呼んでいるのは、部分適用でした。Ultimate関数の呼び出しでコールバック関数を渡したいが、渡す関数の引数の数を減らしたいときに使う。あるので、これらもカリー化できるようにしてみる。関数を呼び出し、少なければ関数を生成して返す。実引数は左側から詰める。bigger_than.currying(12)とは書けない。method関数でメソッドオブジェクトを得てからカリー化する。ブロックとして与える。[30]最後はメソッド。レシーバオブジェクトが特定されていなければならない。"fugahogehoge"まとめカリー化によって、関数・メソッド単位をカスタマイズして再利用できるようになる。引数は、左側にカスタマイズのパラメータとなるような項目を持ってくるのがいい。サイト内関連ページHaskellで遊ぶRubyで無理をしなくたって、Haskellなら関数単位で再利用できる。