bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

関数型リアクティブ・プログラミング入門 ― リアクティブ・プログラミング

1.リアクティブ・プログラミング

Reactive programmingの意味を明確にしたいと思って、reactiveをオンラインのLongman辞書で調べてみた。すると、reacting to events or situations rather than starting or doing new things yourself(自分自身で新しいことを始めるあるいは行うのではなく、イベントあるいは状況に反応すること)となっている。Reactiveという言葉を、同じ意味を有するreactという言葉(但し、こちらは動詞)を用いて定義している。これでは、reactを知らないと意味が分からない。

そこで、reactを調べてみると、BEHAVOUR / FEELINGS to behave in a particular way or show a particular emotion because of something that has happened or been said(あることが生じたあるいは言われたことにより、特別な方法で振舞ったりあるいは特別な感情を示したりするための振舞い・感情)となっている。

この件は、これで意見落着したが、世の中には、こうはいかないものがある。2013年に映画化された『舟を編む』は辞書作りの話だが、その中で、右をどのように説明したらよいかが出てくる。皆さんは、どのように定義するだろうか。左の反対側。それでは、左はどのように定義すればよいのだろうか。まさか、右の反対側。これでは、堂々巡りになってしまう。でも、三省堂のWeb Dictionaryは、(対)左、となっている。同じ発想だ。

もう少し、いい定義はないかと思う。先ほどのオンラインのLongman辞書ではyour right side is the side with the hand that most people write with(あなたの右側は、ほとんどの人が字を書く方の手の側である)となっている。映画でもいろいろな候補が示された。アナログ時計を見たとき数字の1から5のある側や、この辞書を見たとき偶数ページのある側や、数字の10を書いたとき0のある側、などだ。

脱線はこのくらいにしよう。reactiveという意味を調べたことにより、重要な二つの単語を得ることができた。Event(イベント)とBehavior(振舞い)である。この二つは、reactive programmingを特徴づけている重要な概念である。

イベントと振舞いを身近なものにしてもらうために、いくつかの例を挙げてみよう。パソコンをたたいている私の部屋の窓からは、とても大きなフォークリフトを見ることができる。このフォークリフトは大きな鋼材をぶら下げている。時々、冬の関東地方特有の空っ風に吹かれて、鋼材が大きく揺れている。事故が起こらないかと心配になる。これは余計な心配だろう。話を元に戻すと、空っ風がイベントで、ぶら下がっている鋼材が振舞いと見ることができる。さらに、ぶら下がっている鋼材が、空っ風によって、振舞いを変えるとみることができる。

ソーシャル・ネットワーキング・サービスにもはやりすたりがあって、最近はLineを使う人が多くなっているようだ。知人の誰かがメッセージを送ってくると、自身の携帯電話が反応し、リズムのある音で知らせてくれる。仲間関係を断切りたくはないという恐怖心から、多くの人は、それに応えるようなスタンプを送り返していることであろう。この場合は、相手側のメッセージがイベントで、携帯電話の操作が振舞いと見ることができる。誰かからのメッセージを受け取ったことで、スタンプを送るという、特別な操作(振舞い)をしたと考えることができる。

松の内も明けない頃、北朝鮮が核実験を行った。各国は、この実験に抗議するために、抗議声明や経済封鎖などの対抗策を検討している。核実験がイベントで、各国の政策を振舞いと考えることができる。そして、核実験というイベントによって、各国が対抗策という、特別な政策(振舞い)を取ったと考えることができる。

その他にもたくさんの事例を挙げることができるが、これらに共通するものを抽出し、論理的に扱えるようにするのが、科学である。そこで、イベントはある時間にある値を及ぼすものとし、振舞いは時間を変数にしてある値を有するものと考えることにする。

このように表すと、先の例では、イベントでのある値は、空っ風やメッセージの受信や核実験であったりする。また、振舞いでのある値は、ぶら下がっている鋼材や携帯電話の操作や政策となる。また、イベントを受けたとき振舞いが変わるが、それは、大きな揺れやスタンプの送信や対抗策であったりする。

もう少し、イメージがつかみやすい例を挙げることとする。今、池の水面の動きを振舞いと考えることにする。この振舞いは、\(f(t)\)と表すことができる。最初、池の表面は鏡の面のようにとても滑らかであったとする。

そこで、時間\(t_1\)に石を投込んだとする。これを\(E(t_1)\)とする。これによって、滑らかであった水面には、波紋が生じる。即ち、輪が幾重にも広がって進む。これが、投石の後の水面の振舞いとなる。

すぐに、即ち時間\(t_2\)で、また新たな石を投込んだとする。これを\(E(t_2)\)とする。二つの輪が重なり合い、きれいな文様を描くであろう。

池の水面の動きは、物理法則を用いれば表現できるだろうから、これを\(f(t,E(t_1),E(t_2))\)とする。即ち、イベントに影響を及ぼされた振舞いを表現することが可能となる。

もう一つ、部屋の中の音を振舞いと考えて\(f(t)\)で表すこととする。部屋では、ピアノを弾いている人がいて、時間\(t_1\)で鍵盤\(k_1\)を、時間\(t_2\)で鍵盤\(k_2\)を、…、時間\(t_n\)で鍵盤\(k_n\)という具合に、弾いていたとする。これらはイベント\(E(t_n,k_n)\)で表すことにする。ピアノが楽譜にそって上手に弾かれているのであれば、音の振舞いは曲となる。これは振舞い\(f(t,E(t_1,k_1),E(t_2,k_2),..,E(t_n,k_n)…)\)として表すことができる。