HIMA#4
第4回 HIMA(Haskell Internet Meeting Anytime) 開催地
HIMAはHaskellプログラミングに興味をもつ人が,とりとめなく,おしゃべりをするという会です.一応のお題はありますが,Haskellプログラミングの知識経験の有無深浅にかかわらず,興味のあるかたはご参加ください.もちろん,ROMあり,茶々ありです.今回は以下の要領で開催します.
日時: 2010年1月23日(土曜日) 20:00~23:00
場所: ここ
幹事: 酒井
お題: Functional Reactive Programming (FRP)
参考:
http://d.hatena.ne.jp/maoe/20100109/1263059731
こんばんは。テストテスト。
waveって It's All Text!で外部エディタを使って書き込みとかできないんだっけか。
まずガウスのように始めたまえ。
書き込み方わからん。これ書けてるのかな?
かけてますかどうも。
今から呑みにでかけます。ログだけ取るままにして出かけます。では。
うーん、できないっぽいなぁ >外部エディタ
時間ですね。はじめましょうか。
こんばんは。
こんばんは。Google Wave はまだそんなに使えてないので、どんな感じになるか分からないのですが、よろしくお願いします。
今回はFRPがテーマということで、maoeさんの記事をネタに色々と語れたらと思います。
maoeさんいるかな?
私はmaoeさんの記事は、あらかじめ読んでおこうと思いつつも読めてなくて、今読んでます。
今来ました
きたー
まず、Reactive Programming とは何かというところを読んでるのですが、Excelが実はreactive programmingだというのは言われて目から鱗でした。
Excelをつかったreactive programmingはhttp://d.hatena.ne.jp/NyaRuRu/20080317/p1 ここら辺に書いてあるのを見てほほーと思って書きました
おお。これはすごいですね。
reactive programmingとか言われても何に使うんだろうと思ってたんですが、ああなるほどなと思いました。
ただ、これを見てもHaskellでどんな感じになるのかはさっぱりわかりませんでしたが。
たしかに。
で、それをHaskellに持ってきたのが FRP だと。
そうですね
それで、たぶんこれを使うと、IOモナドだらけのプログラムをもう少し関数型の人でも気持ちいい形で書けるようになるんじゃないかなと期待しています。
reactiveというからには外部から何か入力をもらって、それに反応するプログラムが向いているわけですが、よくよく考えるといわゆるサーバといわれるものはたいていそういうプログラムなので、サーバを綺麗に書くのに有効なのかなという印象です。今のところ。
質問
maoe さんの二番目の記事の
bellEvent = beepAction <$> beepTimer
は
bellEvent = bellAction <$> beepTimer
の間違いですか?
あれ、bell とbeep が全体的に揺れているなぁ。
この辺り、全部見直す必要があるかも。
表記揺れはたぶん無くなりました
おお、Applicative 便利だ。
一度 Event (IO a) にして、そっから IO a にするのが、なるほどという感じ。
Behaviorは連続的に変化するからこういうことは出来なさそうだけど、Eventは離散的に発生するイベントだから、こういうことが出来るんですね。
reactiveは以前に論文を読んだっきりだったんですが、やっぱりよく考えられてるなぁ。
Yampa派(?)としてはどうでしょう? > shelarcyさん
私が Yampa 派だったのは Conal の reactive パッケージが出てくるまでだったので、特に Yampa 派というわけではないです。Yampa は性能面の問題が指摘されているので、その辺で Conal の reactive や Grapefuit の方が強い感じですね。(Yampa に対する性能向上を図ろうという試みもあったのですが、その後続く論文や実装が存在しないので……。)性能とプログラミングにおける使いやすさ二つが両立できるのであれば、Yampa をやめて rective 等に乗り換えても良いかなと思います。(現在問題があって Conal は wxHaskell を使っていませんが、問題を解決し次第 wxHaskell 上に FRP な GUI ライブラリを作ると Conal も言っていますし……。)
Yampaに対する性能向上だと、一応 Causal commutative arrows and their optimization みたいなのはあるかと。
その成果が 0.9.2 以降の Yampa パッケージに取り込まれているのですが、まだまだ性能面での問題が残っていて、そこがまだ改善されていないという意味です。現在の Yampa あー、酒井さんの示してくれた論文の方の最適化はまだ取り込まれていませんね。別の論文と勘違いしていました。ただ、いずれにせよ、HackageDB の方にあるパッケージに成果が取り込まれないとユーザーが恩恵を得られないので……その点で、Conal が積極的に関わっている reactive パッケージの方が性能的に有利だと思います。
memory leakとかtime leakを解決するためにarrowisedなFRPができて、その成果物としてyampaがあると思っていたので、yampaは速いのだと思っていました。性能面に問題があるとは。。。
処理が動的になってしまって、静的な最適化が効かないので「もっと静的にして、静的な最適化ができるようにする!」という趣旨の話がこっちの論文に書いてありますね。 http://www.cs.nott.ac.uk/~nhn/Publications/icfp2005.pdf スライド: http://www.cs.nott.ac.uk/~nhn/Talks/ICFP2005-DynamicOptimizationUsingGADTs-4up.pdf
そうだったのか。僕も結構意外です。
Behaviorはsnapshotで某かのEventでサンプリングしてEventに変えてやる必要があるみたいです。
ふむふむ
あと、FRPにはpushとpullがあると。
pullというのは一定時間ごとに出力値を再計算しようとして、トップダウンに動かしていく感じかな。
で、pushは逆に入力側から考えて、入力が変化したらそれに影響をうける部分を再計算するという感じかな。 pullの方が関数的なスタイルになるのが良くて、pushの方が性能がよい(レイテンシが少ない)のが利点と書いてありましたが、push式は触ったことがないのでどんなモンなのか気になるところ どっちかというと実装の詳細のような気もするけど、プログラミングスタイルへの影響もあるのでしょうか? reactiveの論文にはスタイルに違いがあるようなことが書いてあったと思います
FRP で web サーバーを書いたとします。
GET イベントを受け、ファイルを読んで返す関数の型は、
どうなるのですか? IO a から逃れられますか?
Event Request -> Event Responseな関数とEvent Response -> Event Actionな関数を作って組み合わせる感じになるのではないかなと思います。前者ではIOができないので完全なResponseが作れなそうな気がしますが。。。HTTPサーバとかもっと簡単なところではircボットとかを作ってみるのがよいのかなあ。
ただいま自宅に帰りつきました。亀コメントですが、HaskellはIOからはのがれられないですねぇ。Haskellであるかぎり。
IOから逃れることはできなそうだと思っています。
できなそうなのですが、Event (IO ())なイベントとしてIOを扱うことで、IOべったりなコードよりは納得できるスタイルで書けるんでないかなあと思います。実際に大きな例をかいてないのであれですが。
単発の処理だとあまり嬉しさはないのかなという気が。それよりは入力値の変化やイベントよって状態が変わったりとか、そういうやつの方が嬉しそう。
ところで、現在開催中の POPL の併設 Workshop(または Symposium)の FRP 関係の論文を読んでいる方はいますか?
例えば、"Mixed-level Embedding and JIT Compilation for an Iteratively Staged DSL" http://www.cs.nott.ac.uk/~ggg/publications/wflp2010.pdf Paul Hudak と共著の論文も FRP 関係だと思うのですが、そちらの方は Web からでは見られないようです……。 論文タイトルは何ですか? 共著者の Hai Liu のページに論文が出ていました。最新の論文二つです。 http://www.cs.yale.edu/homes/hl293/ ……が、 FRP 関係ではなかったっぽいですね。 FRP関連の論文といえば、Safe Functional Reactive Programming through Dependent Typesというのを見かけて興味がわいています。reactiveでプログラムを書いているとメモリリークはわりとすぐ起こるので、そういうのが無くなるのかなあと。 ICFP2009の論文ですね。それは私も読もうと思ってました。
え、それFRP関係の論文なの?
ぜんぜん追いかけてないのだけど、タイトルからはあまりそうは見えないような。
みたいですよ。著者の一人が、YampaSynth という Yampa でシンセナイザーを作成した人で、もう一人が Henrik Nilsson だったので FRP 関係の論文だと思って見てみたら、Fuctional Reactive Programming という単語が論文中にありました。(きちんとは読んでいませんが。) http://hackage.haskell.org/package/YampaSynth
The FHM design was originally inspired by Functional Reactive Program-
ming (FRP) [4], particularly Yampa [12]. A key difference is that FRP provides functions on signals whereas FHM generalises this to relations on signals.
とか書いてありますね。制約プログラミングっぽい感じの書き方が出来るのかな。
話を戻すと、……ええと、何だっけ?
とりあえず、Behaviorの説明を読んでます。
来てみました。テスト
いらっしゃーい。
実際にFRPのプログラムを書くときにBehaviorがうまくはまる事例がしりたいなあ
Event と Behavior という区切りが正しい物であるかどうかは分かりませんが、Yampa の何でも Event というスタイルでは、実際に使ってみて、どの関数がどういう意図で使用されているかがかなり不明確で、すでに書かれたコードの意図が読み取り難いという印象を受けました。なので、そういう意図の区別がつけ難い所は、何らかの形で区別できるべきだと思いますね。
ん? YampaのSFって意味的には Signal → Signal で、Signal = Behavior だから、なんでもEventというのは違うのでは?
うーん……実際に書かれたコードの意味が取り難かったので、そこがどうにかならないのかという意味です。もちろん、きちんと考えればそれぞれの関数の意味を確かめることができるのですが、Yampa のスタイルではソースコード上の意図を読み解く難易度が高かったので……もちろん、慣れの問題もあるでしょうけれど。
いや、そもそも「何でもイベント」なんですか?
Conalがarrowベースの方はeventとbehaviorの区別が無くなるのがいやだと書いていたのを見かけました。全部eventなのかはわかりません。
ああ、分かった気がする。
SF a b が基本で、イベントを扱うときは a, b のところを Maybe にするんでしたっけ?
そんな感じです。 Maybe 型の代わりに data Event a = Event a | NoEvent という型を使いますが。
Yampaでの事例をReactiveで書くことを考えると、Behaviorは自然に出てくるんじゃないかな。
Arrows, Robots, and Functional Reactive Programming http://www.haskell.org/yale/papers/oxford02/index.html
Functional Reactive Robotics: An Exercise in Principled Integration of Domain-Specific Languages http://haskell.cs.yale.edu/yale/papers/ppdp02/index.html
あたりとか。 integralを見て思い出したのですが、Behavior編のIntegralI.hsというサンプルコードはtime leakするのですよ。それがintegralのところが原因ぽいのですが、どう直したらいいのかさっぱりわからないのです。 質問: time leak って何ですか? 実行するとよくわかるのですが、徐々にCPU使用率が上がって重くなっていくんです。 試してみよっと。 まずは cabal install reactive あれ、少し試してみたけど、CPU使用率は特に上がってこないです。 Windows 上の GHC 6.10.1 で ghc --make -O IntegralI.hs でコンパイルして、実行して、キーを適当に連打しまくってみました。 って、あれ、そもそも入力したキーがprintされなくちゃいけないのかな。何も出力されてないや。 入力はhSetEchoで消しているので正常な動作です。わかりにくいから表示するようにした方が良さそうですね。 でも、adaptE $ print <$> ... ってあるから、何かprintされるのかなと。 あれ?ホントは毎秒数字が出てくるはずです。 このサンプルプログラムは>とか<を押すと速度を変えることができて、その速度で走っているときの位置というか距離を毎秒出力するようになっています。 何も出てきてないです。 Integral.hs はどこにありますか? cabal install reactive はしました。すばらし、ありがとう。こんばんは、みなさん。こちらの環境では、Integral.hs は 2 秒おきに、数字(Double)が増えて表示されています。leak しているのかどうかは、これから観察します。コンパイル時に最適化するかしないかで違いますね。-O つけなかったら 100% CPU 食うけど、付けたら多少はましになりました。 こんばんはー 池上さんはMacでしたっけ? じゃあ、Windows固有の問題かなぁ。 Linuxで試すか…… Linuxだと確かにそうなりますね。 はい、Mac です。 こんばんは。http://github.com/maoe/reactive-examples のIntegralI.hsです。 2秒おきというのもおかしいな。僕の手元では-Oの有無にかかわらず重くなっていきます。 [0.2..] なんだから、いいんじゃないでしょうか。違うのかな。 Oh! Integral.hsではなくてIntegralI.hsの方です。Integralの方もリークしているとは! Integral.hs のほうは -O したら、leak していなさそうです。Integrall.hs のほうもこれから見てみます。IntegralI.hs も -O つけたら特に time leak というものはなさそうです。上がったり下がったり操作できて楽しいね。 勘違い、'0' は上下を止める操作なんだ。 お、リークしてないですか。やはり環境依存なのかなあ。 そうです > 上下を止める操作 あれれ。環境依存でしたか。僕はLinux上のGHC 6.12.1です。 ところで、どうでも良い点かもしれませんが、みなさんがつけている最適化オプションは -O ですか? -O2 ではなくて。 僕は -O ですね。 ロボット制御はなかなかぴんと来ないけどやってみよう。 あと、去年と一昨年のICFPCの問題を、FRPでちゃんと解いてみようと思ってたのを思いだした。 特に一昨年の問題 http://web.cecs.pdx.edu/~sheard/2008IcfpContest/ はセンサーデータとかイベントの処理や制御と、プランニングの処理とを書く必要があるので、そのあたりをFRPを使ってうまく整理して書けるのではないかと期待してます。 たしかFRPのフレームワークを自作されたとおっしゃってましたよね? 去年のやつは、Arrowベースの簡単なものを自作してやってました。 ArrowベースというとやっぱりYampaみたいにSFなんですか? そうです。 http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20090630#p01 SFと名前は違うけど、こんな型でやってました。 -- Mealy Automata newtype Automata i o = Automata{ next :: i -> (Automata i o, o) } Arrowベースとreactiveみたいな古典的なやつとで、書きやすさの違いとかってありますか? 単なる予想です(書いたことがないので)がArrowは2引数なので、その分難しいかと。 Arrow notation 面白いし、いいなーとは思うんですけどどうでしょうか。 Conal Elliottはやだーっていってますね 誰の論文だったか、はっきり覚えていないのですが、「Arrow は theoretical に遅くなることがわかるので避ける」とか、えーと、Parsec だったかな。なぜ monadic parser combination にするのか、というところで触れてた。で、その理由はよくわかりません。 Arrowの最初の動機のひとつにMonadベースのパーサーの効率の悪さがあったのに、それが本当だとしたら皮肉だなぁ。 ふむ。そんなことがあるのですか。よく見たら http://conal.net/blog/posts/why-classic-FRP-does-not-fit-interactive-behavior/ ここにもArrowだと非効率みたいなことが書いてありました なぜ非効率なんでしょう。 私も気になります。 「Arrowの最初の動機のひとつにMonadベースのパーサーの効率の悪さが」というのは Generalising Monads to Arrows に載ってます。 著者の John Hughes を問いつめよう、残念ながら日本に来る機会はそうそうないんだけど 4月にはこないのかしらん? 4月になにがあるんだっけ、AIMXIに誰が来るのかはまだ聞いてないです。FLOPS 2010 (Apr 19-21) には来ないと思う それはざんねん reactiveはまだ実際に使ったことはないので、ちょっと比較できないです。 ただ、Arrowのレベルの抽象化だと、その時々の入力と出力について書くのはいいんだけど、「これをやって、あれをやって」みたいな高レベルの制御を書きにくいようには感じました。Reactiveだとその辺りどうなのかなぁ。 ↑ あれっ、二人で一つのコメントを編集できるみたいですね。 出来ます、他人のコメントも編集し放題w Playback という機能があるのですが、この議論が終わった後、試してみるといいです。一字一句いちいち録画していて、逆戻りしたり、リソースがもったいない。 ああこれ面白そう。
そろそろ時間ですね。
というわけで、とりあえずはお疲れさまでした~
乙
お疲れさまでした〜☆♬
お疲れさまです
今回、初めて Google Wave を使ってみたわけだけど、結構面白いですね、これ。
ただ重いなぁ。
昨日も使ったんですが、Mac でFirefox じゃない人は IME が途中でこけるという症状も見受けられました。今回は、全員喋れたようで何よりです、おつかれさまでした。
IME ではないのですが、Safari で使っていて Reply がうまくできなくなったので、一回ログアウトしました。(ちなみに Opera だとそもそも Wave の利用自体ができません……。)
ところで、今回のログを Google Wave のアカウントを持っていない人にも公開するにはどうやるのがいいのかなぁ……
各Waveの右下にFilesというプルダウンメニューがあるのだが、その "Download all" してもなにも起こらない Firefox
それって、添付ファイルの操作用のメニューだと思います。
"Step 1 – Use Firefox. Google Chrome works great for Wave, but Firefox is needed for this trick." へー
おお、それでPDFにでもすればいいか。
こちらでは、画面に見えている部分しか PDF にならない…ログを取るために Google Chrome インストールしたのに、やはり一ページだけ…
むー、User Agent Switcher で User Agent を iPhone に切り替えたけど、FirefoxでWaveのページが表示できない。
あと、うっかり[X]ボタン押して Wave 消しちゃうと、もう全部消えるそうです。全世界の人々が怒っていて第三次世界大戦勃発前みたいですよ…
明日の準備もあるので、諦めて寝ることにします…Waveさんがんばって…
おやすみなさい