スティルハウスの書庫の書庫

はてなダイアリーで書いてた「スティルハウスの書庫」を移転してきました。

Excelの高階関数とVisual FP

Excel高階関数が備わっているのはご存じですか? 多くの人がよく使っている、式の一括コピーのことです。例えば数値が並んでいる列があるとき、その頭のセルの右となりに式を設定して、なにがしかの式を定義をします(例えば「=A1+1」など)。そしてCtrlを押しながらその式のセルをクリックして下方向にドラッグしていくと、同じ式を複数の数値に一括して適用できます。これをRubyで書くと、

[1, 2, 3].collect { | i | i + 1 }

みたいな感じです。つまり、「セルの一括コピー」という「操作」が、関数を複数のデータに一括して適用する高階関数になっているわけです。

大学時代、卒論のテーマにしたかった(が時間が間に合わずできなかった)のが、このコンセプトを拡張した「Visual FP(Functional Programming)」です。当時、Haskellはまだありませんでしたが、ジョンバッカスのFPの論文を(難しいのでよく理解できなかったけど)読んで、関数プログラミング(の元祖のFP)ってすごい〜(副作用がない、プログラムコードを代数的操作でごにょごにょ変換できる)と感動してました。副作用がなければ、変数の複雑な状態遷移を追っかけながらのプログラミングやデバッグが不要となります。これってもしかしてエンドユーザーコンピューティングにぴったりのパラダイムじゃないか? というのが当時の私のアイディアです。FPのエッセンスを、ちょうど上述の「Excel高階関数」のようなビジュアルプログラミング環境で実装すれば、以下のようないろいろな応用が広がるだろうと考えました。

  • ビジュアル操作のみで誰でも使える
  • 配列、表、木構造、グラフなど数種類のデータ構造を扱える。対象範囲をマウスで選択して、map, select, injectみたいな高階関数をボタンや右クリックメニューで呼び出し、ユーザー定義の式やフィルタ(ブロックの中に書くようなロジック。副作用のない関数)をデータ構造に一括適用できる
  • 各種のデータ構造をいろいろな順番(深さ優先/幅優先)でトラバースしたり、諸条件でフィルタリングできる(SmalltalkRubyで制御構造を自由に作れたり、XPathXMLを一発操作できるのと同じ感じ)
  • 一連のUI操作をマクロ(これも副作用のない関数)として記録できる
  • 汎用的なワークフローやデータ処理プロセスを高階関数として提供し、そこにユーザー操作による具体的なデータ処理関数を渡してカリー化する
    • ワークフロー関数の例:「第1引数の関数Aで抽出したデータを配列に並べ、第2引数の関数Bを一括適用する」
    • ユーザーが定義した関数A:「木構造の住所録データの中から郵便番号を選択する」
    • ユーザーが定義した関数B:「郵便番号から住所を取得する」
    • これらをカリー化して得た関数:「住所録から郵便番号に基づく住所一覧を作成する」
    • これらすべてをUI操作でアドホックに行える
  • 長くなったマクロをFPみたいに代数的操作でごにょごにょ変換できる。Mathematicaで数式処理する感じ。因数分解っぽいことができたら、複数のマクロで共有できる部分を抽出できるかな?
  • 副作用がないから大規模データに対する並列処理も可能(ここでMapReduceにつながる)

といったいろいろな妄想が出てきます。当時はSmalltalk-80上でこのVisual FPの実装にトライして、簡単な機能(木構造データをクリックして関数を一括適用する)は実現できましたが、そこであえなく卒業となってしまいました。

それから16年、いつか誰かがこれに似たようなものを実現してくれるかなと待っているのですが、あまり見たことはないです(私が知らないだけかな)。今だったらクラウドMapReduceがあるので、そのフロントエンドとしてVisual FPを実装できれば、例えば「100万件あるお客様データから電話番号を抽出してソートし、1000万件あるコールセンターの着信履歴の電話番号とマッチングして、お客様データに着信履歴を追加する」といった大規模なバッチ処理も、Excelレベルの簡単なビジュアル操作だけですばやくローコストに実現できるかもしれません。