はてなキーワード: ストリームとは
ストリームを関数の外部に持つFRPを純粋関数型っていうのは少数派でしょ。
ユーザからの入力をリアルタイムに処理するプログラムにはFRPは有効だよね。
「OCamlでは」じゃないの?
全部純粋関数型(引数と戻り値に収める、状態渡し)にするのを良しとするHaskellと違って、OCamlは副作用も部分的に使うのが普通で、IOモナドみたいな入出力までも純粋に書くための道具立てが揃ってない、それでちょっと冗長になる、ってことでしょ?
OCamlの元々の推奨スタイルならもっと短く書けるんでしょ?
俺はそう読んだけど。
それっぽい書き込みほどそうやって、事実誤認だ、と強調するから、なんで当事者でもないのに、そんなことが断言できて、電波だということになるんだ?
だって駱駝でも住井でもない面識も無い俺の書き込みが住井扱いされるんだもの。
いやだから、どの関数で読み書きされようと、誰が書き換えようとも、時間にたいしてイミュータブルな定数なんだから、定数は定数なのよ。
関数型という枠組みを拡張しているのではなく、関数型という枠組みの中にミュータブルな時間要素が純粋に収まるようにしているのがFRPだろ。「関数型を拡張してるから」というのは、また独自拡張だ、という批判を許すし、FRPが関数型の拡張だというのは誤解を招くし、語弊もある。
いやそもそも岡部氏が複雑なアプリになるとFRPが必要だ、と批判すると状態渡しで充分だ、という反発があった。それが誤魔化しだとして、今に至るし、否定されているから一連のブログでの徹底的なまでの反撃がなされている。
事実、「駱駝」は「状態渡しはむしろ異常」って書いた上に、岡部氏のコードの倍の分量の複雑なコードしか示せなかった。あの無理して書いたのが第三者にもまるわかりの状態渡しの実装って間違ってるんじゃないの?
これまでのアンチ岡部のやり方を眺めていると、被害者の岡部氏の分析には一定の信ぴょう性が認められるよね?
しかも、それっぽい書き込みほどそうやって、事実誤認だ、と強調するから、なんで当事者でもないのに、そんなことが断言できて、電波だということになるんだ?という素朴な疑問がある。当事者だから否定してるんだろ、と誰が見てもおもうだろ。
ストリームだから定数とか、過去の値保存してるから定数とか言ってみたところで、プログラム内の色んな関数から読み書きされる可能性があって誰が書き換えたか中身読まないとわからないんじゃ、グローバル変数使ってるプログラムの欠点をそのまま持ってるじゃん
いやだから、どの関数で読み書きされようと、誰が書き換えようとも、時間にたいしてイミュータブルな定数なんだから、定数は定数なのよ。
FRPライブラリのサブタイトルに、 library that provides first class reactive value 'over time' と書かれている、これ拡張じゃないのか?
拡張なら「関数型的じゃない」っていわれたら「関数型を拡張してるから」って答えればいいだけの話
「これが正しい関数型でお前らの状態渡しは間違ってる」みたいに言うから荒れる
間違っている電波だ
個人的に電波だと思うのはこういう匿名の書き込みを住井だ駱駝だ言い出すところ
ストリームだから定数とか、過去の値保存してるから定数とか言ってみたところで、プログラム内の色んな関数から読み書きされる可能性があって誰が書き換えたか中身読まないとわからないんじゃ、グローバル変数使ってるプログラムの欠点をそのまま持ってるじゃん
FRPライブラリのサブタイトルに、 library that provides first class reactive value 'over time' と書かれている、これ拡張じゃないのか?
https://www.npmjs.com/package/timeengine
IOモナドをDisってるのかどうかまでは知らない。しかし、すでに出たサンプルからはFRPの効力がまざまざと見せつけられている。
荒れるのは自由だけど、両方正しいとかそういうのじゃなくて、間違っている電波だみたいな叩きしかなくて、要するに感情論で反対派は反発しているだけでOK?
あるよ。
関数がどのパラメータに依存して、何を結果として返すのか明確になる。
グローバルな値を参照したり書き換えたりしてたら、関数の中身読まないとわからなくなる。
短いプログラムならそれでもいいけどね。
別の誰かが書いてたように、上位スコープ内に定義されてるDOMでも、数学ライブラリでもなんでも、引数で関数に渡すのか?
グローバルな値を参照したり書き換えたりして
いやだから、定数なんだから書き換わらないんだよ、FRPのストリームはconst 定数なんだから。
オブジェクト指向と対比して考え方をまず学ぶって、岡部路線、住井グループはそれを目の敵にしていて集団的に攻撃している様をみたプログラミングコミュニティは逃げ、その後、不毛な大地のみが残った。
FRPを純粋を理想とする関数型+時間で変化するストリームを値にマップして扱うリアクティブプログラミングの組み合わせっていうなら、別に誰も反論しないと思うけど。
HaskellのIOモナドみたいな別の抽象化をDISりつつ、FRPこそ正しい関数型みたいに言うから荒れるんじゃないの?
あるよ。
関数がどのパラメータに依存して、何を結果として返すのか明確になる。
グローバルな値を参照したり書き換えたりしてたら、関数の中身読まないとわからなくなる。
短いプログラムならそれでもいいけどね。
「岡部氏のFRP」ではなくて、FRPっていうのはそういうもの。
俺も岡部氏のコード見ながら、この点考えてみたが、時間依存のFRPの値を__TIMEVALUEのようなひとつのオブジェクトにまとめて、逐一すべての関数の引数に加えれば?と思ったが、全部の時間依存の関数にそういうことをする意味はない、岡部氏のコードは、反対派ブログに書かれているコードよりも可読性が高く、コード量も半分とか圧倒しているし、「状態渡し」ではアプリは作れない、というのも岡部氏が正面切って批判するまで誰もはっきりと言わなかったことも反対派の信用性がない理由。それに「岡部氏のFRP」とか文句言う反対派の理解が怪しいと俺も思うようになった。
状態渡しはまやかしだ、とか時間を軸にしたストリームを外部に持ったFRPこそが正しく実用的な関数型、みたいに言うから反対されるって言ってんの。
命令型ならば、そもそもそういう言い換え=パラダイムの変化は生じない。
そもそもおまえは、
という
__x
__x.t
の区別さえついてないっぽい。
かなりのアホだな。
違うわアホ
その__x上の分布は、「処理系が評価する時刻」に従って広がっている。
もう一回だけまとめると、__x.t=__x.t+1のような単純な例はもちろん、
岡部氏のライブラリは、右辺の評価時間におけるxの値を、左辺の評価時間におけるxの値としてイミュータブルなストリーム上に分布する、という説明になるんだろ?
ライブラリの内部的にはな。まだ内部で破壊的代入してるってゴネてるの?精神病?
ユーザが見ても関数型だが、おまえみたいに命令型のコードかけば、その文脈でも関数型の値が帰ってきたり、定義することができる。
お前自身がすすんで命令型のコード書いてるんだから、その評価時間のズレで「過去の時間」ってのが発生するんだが、命令型コードの意味しってるかい?
kenokabe氏が「タイマーの解像度設定しながらマウスイベントを同時にとってなんかやる」とか言ってる部分がまさに
(本当の)FRPで書かれたプログラムを実際のハードウェア上で実行するために
「ストリームから要素を取り出す」なり「時刻をパラメタとする関数を現在時刻に適用」してるところね。
念のため、コードを読まない(読めない?)人のために補足。
実際に動いてるし、その部分のコードの入口も明示されたのに、
http://kenokabe-techwriting.blogspot.jp/2016/05/frp_18.html
残りは全部、使ってるライブラリのソースコードからfrequencyやリフレッシュレートやら、timerの解像度っぽいことをアピールしてるみたいですが、
タイマーの解像度設定しながらマウスイベントを同時にとってなんかやることと、
状態f(0),f(1),f(2),…を得る、という本来のFRPの基本原理
ってまったく違うでしょ?
誤魔化すなと。
状態f(0),f(1),f(2),…を得る
というのはどこだ?とけなされているのだけど、
イベントごとに写像されているのだから、状態f(t)だ、とかいうのなら、
岡部氏の言う時間軸をストリームにする、という話と関係ないのに、
ただ「実際のシステム時刻t=0,1,2,…」って言いたかっただけちゃうんか?ってのは見るものすべてにバレてる誤魔化しだ、って意味でしょ?
http://kenokabe-techwriting.blogspot.jp/2016/05/frp_18.html
残りは全部、使ってるライブラリのソースコードからfrequencyやリフレッシュレートやら、timerの解像度っぽいことをアピールしてるみたいですが、
タイマーの解像度設定しながらマウスイベントを同時にとってなんかやることと、
状態f(0),f(1),f(2),…を得る、という本来のFRPの基本原理
ってまったく違うでしょ?
誤魔化すなと。
状態f(0),f(1),f(2),…を得る
というのはどこだ?とけなされているのだけど、
イベントごとに写像されているのだから、状態f(t)だ、とかいうのなら、
岡部氏の言う時間軸をストリームにする、という話と関係ないのに、
ただ「実際のシステム時刻t=0,1,2,…」って言いたかっただけちゃうんか?ってのは見るものすべてにバレてる誤魔化しだ、って意味でしょ?
http://anond.hatelabo.jp/20160517023637
それを処理系が実際のシステム時刻t=0,1,2,…に適用して
状態f(0),f(1),f(2),…を得る、という本来のFRPの基本原理
いや、おまえは、単に、マウスイベントを拾って、FRPストリームに流す、という接続部分、つまり、FRP変数への書き込みについて、イチャモンつけてるんだよな?おまえにとっての「自動」の「同期」って何?
マウスイベントなりをラップしたFRPライブラリで、そのラップイベント宣言したら、ラップ変数に自動的に流れるとかそういうこと言いたいんだろうが、そこからその変数、関数なりで変換して行くのに、それがラップされてようがされてまいが、手間はまったく一緒だって理解してる?
あと、そういう既知のイベントなら、既知のマウスイベントなりを全部ラップしてやろうとおもえば、やれないことないだろうし、できるが、
既知ではない、FRPライブラリでラップされてないIOイベントとかどうすんの?w あほなの?w
たとえば、HTTPイベント、WebSocketイベント、全部FRPライブラリでラップして、
みたいにやるのか? 誰かが書いてくれるまで待つとか?w
あと、マウスの位置から10オフセットさせたい、とかオプションも無数にありうるわな?
オプションサポートされてないラップだったらどうすんの?w やっぱアホなの?w