Functional Reactive Programming
f氏:こんばんは! fです。僕は話し声がうるさいとよく言われるんですが大丈夫ですか? うるさかったらマイクなしでやるんですけど。いつも耳栓を持っていまして「うるさい」と言う人には配っています(笑)。今日はそんなに手持ちがないので……。
僕、今日のFRPの発表は2年前にLispのMeet upでしていて「話がぜんぜんわからん」と言われて1分で強制終了をさせられる痛い目にあったことがあります。それから2年越しでいろいろ学びました。ちょっと大人になったというか、結婚指輪もしていますし、実は今日は最愛の人が会場にいまして。MacBook Proなんですけど……。
(会場笑)
という感じで、いい感じに滑って1分で強制終了をさせられたんです。FRPはみなさんご存知ですか? Functional Reactive Programmingの略だということを聞いたことある人?
(会場挙手)
ほとんど聞いたことがある。それで、実際にFRPをやっている人はいらっしゃいます?
(会場挙手)
おお、あとでTwitterで話しましょう!(笑)。Reactive Programmingを実際にやっている人はいます? RxJSとかをつらつらと話していきます。ソースの設計なんですね。
なので、なんでそもそもReactive Programmingがいいのかを最初にしたいと思いますが、みなさんは関数型のプログラマだからforループは使いますか? 最近ここ1週間でforループを書いたという人?
(会場挙手)
けっこういますね。でもみなさんはmap、filter、reduceとかですよね? map、filter、reduceを使ったという人?
(会場挙手)
ほとんどですね。forループよりもmap、filter、reduceのほうがいいでしょ? というのはみなさん勘としてお持ちでしょうけどReactive Programmingで、map、filter、reduceというのは、要はテストやシーケンス型のものをmap、filter、reduceするじゃないですか。Reactive Programmingはmap、filter、reduceをする対象が時間軸のEventやBehaviorと言われるものです。
Reactive Programmingとは何か?
要はストリーミングだと思っていただけるといいんですけど、UIを作るときにクリックがいっぱいきたり、ボタンを誤操作されてテキストを入力されたり、入力がいっぱい来ますよね。それを全部ストリームだと見て、いろんな値が入ってきます。それに対して時間のリストに対してmapやfilterやreduceができるんですよ。
これはけっこう画期的だと思っています。だって普通の書き方をしていたら一つひとつクリックされたらifで処理する……さっきのアフターモデルじゃないですけど、その何かが起こったときにそれに対して、forループみたいな感じで「どうしましょう」となっちゃうわけですね。
だったらmap、filter、reduceで全部やったほうがいいので、僕はReactive Programmingをやるしかないと思っています。しかし、さっきのSimple Made Easyの話になって、今あるReactive ProgrammingのライブラリでHaskellの方たちがけっこういらっしゃるみたいですけど、超ラッキーですね。FRPの素晴らしいライブラリがいっぱいある。
でもHaskell以外の言語の人たちは残念ながら何もないんですよ。なぜかと言うとFRPとReactive Programmingは何がどう違うのか、Functionalが付いただけなんですけど、どっちもFunctionalなんですね。
Functional Reactive Programmingの定義
Functional Reactive Programmingと呼ぶためには必要なことが2つあります。continuous timeとDenotational semantics、この2つがあることがFunctional Reactive Programmingの定義なんです。
これと違うことを言うと、いろんな人に怒られます。Functional Reactive Programmingのcontinuous timeとは何か。例えば温度や時間は常に値があるじゃないですか。常に値があるものってcontinuousですよね。今もこの部屋は何度という値があるし、何時何分何秒という時間もあるじゃないですか。それに対してクリックというのは散発的なもので「クリックしました」とか1回1回散発的に起こるものなんですよね。
これはReactive Programmingだと、両方とも同じに扱っちゃっているんですよ。これがさっき言ってたSimple Made Easyで、離散的なものとcontinuousなものを一緒くたに扱っちゃっている。コンプレクトしている感じです。そこをコンプレクトの反対でリコンプレクトしてほしいんです。それをするのが、まず1つ。
もう1つが、さっきのDenotational semanticsがあります。Schemeだとすごく数が少ないコアな関数から全部の言語を定義するんですね。それと同じでFunctional Reactive Programmingは、たった9つのオペレーターで全部が定義できちゃうんです。Reactive Programmingのドキュメントを見ていただければわかるんですけど、たくさん関数があるんですよ。100とかあって「そんな覚えられなくね?」みたいな。覚えられなくはないんですけど、全部ぐちゃぐちゃなんですよ。……言い方が適当ですね。
(会場笑)
FRPだと、数学的にここの9個だけを決めれば、全部見つけきれる証明がされていて、全部できる。美しくないですか? とくにHaskellの人は美しいと思うんじゃないでしょうか。僕はそれをやりたかった。Haskellの人には申し訳ないですけど、Haskellじゃなくて他の言語でやりたかった。なので、さっきの星1つのライブラリを2年前から作っています。なのにまだ星1つで……。
そのライブラリを作り始めたときに、僕はコワーキングスペースでよく仕事するんですけど、コワーキングスペースで人から声を掛けられたりするのがすごいイヤなので、僕はいつもこうやって……。
(文字の書かれたベストを取り出す)
「Do not disconnect」とするんですね。ヤフーの「LODGE」というコワーキングスペースなんですけど、これを付けていると本当に誰も話してこないんですよ。たまに「talk to me」を付けるんですが、これを付けても誰も話掛けてこないんです。
(会場笑)
というのをこれを付けてがんばって作っておりました。こんな感じですかね。
Denotational semanticsについて
Denotational semanticsについてもうちょっとだけ話します。Denotational semanticsはモナドやファンクタなどを使うと、英語で言うとinstance meaning codes meaning instanceがあって、それがDenotational semanticsと出てくるんです。
それは何かと言うと、モナドやファンクタなどを意識して言語を作ったりすると、意味もすごく明瞭化されるんです。そういうことを考えないで作っちゃうとRxJSみたいになります。僕はFRPをずっと推しているんですけど「モナドとか覚えないと使えないとかありえなくね?」みたいに思われて、ぜんぜん広まらないという感じです。
最後に、2年前に「お前の話がぜんぜんわからないから1分半で終了!」と言われた人に「スティーブ・ジョブズの講演をYouTubeでよく見ろ」とアドバイスをされたので、今日はそのスティーブ・ジョブズの話をしようと思っています。
その前に僕、さっきMacを結婚指輪と言いましたけど、ずっとプログラミング言語を開発していて無職でニートなので、彼女から別れられてしまいました。……ちょっとこれはおもしろい話のはずだったんですけど。
(会場笑)
普通に同情だけされてドン引きされちゃった。という感じですけど、僕がみなさんに言いたいのはスティーブ・ジョブズの「Stay hungry, stay foolish」という有名な言葉がありますよね。僕のこれは結婚指輪じゃなくて非婚指輪と言って「僕はシングルで生きていくんだ」と「誰も寄って来るな」と言っているんですけど、そんなのを付けなくても誰も寄って来ないから安心しろということがこの話です。
(会場笑)
最後に、Stay hungry, stay foolish,stay single.Thank you very much.
以上です。
(会場拍手)