Topics

・関数型プログラミングとオブジェクト指向のパラダイムとしての対立 国内の【自称】関数型コミュニティと海外の論調の違い

ガラパゴス・ネットスラング=「関数型ポエム」という呪詛、先入観的読書と、フェアなレビューの登場

Qiitaの騒動から派生して、東北大学の住井 英二郎@esumii氏、らくだの卯之助@camloeba氏その他が、犯罪者集団に合流して2ちゃんねるでの誹謗中傷チームの「8賢者」「ウィザード組」とかアホなことをやってる件について

JavaScriptではES6+とReact-JSXからES5へのトランスパイルが標準に / ATOMエディタで最速環境構築 厳選パッケージ 3 + 3 2015年夏バージョン

2016年のnode、ES6、React、Babel、Atomエディタ界隈の方向性

Dockerじゃないsystemd-nspawn+machinectlが非常に良い

99%のプログラマがIQ145のJKに「ダサい」と言われてしまう理由とは?【その1】「計算機科学のほんとうの基礎」を理解していない。IQ145のJKと同じ事を語るMITの権威とSICPという聖典の権威を借りてマインドコントロールを解いてみよう

99%のプログラマがIQ145のJKに「ダサい」と言われてしまう理由とは?【その2】関数型プログラミングのイミュータブルな世界観とイミュータブルな実世界を完全に統合

10年先を行く斬新な関数型(FRP)データベースについて説明する 99%のプログラマがIQ145のJKに「ダサい」と言われてしまう理由とは?【その3】

[React (.js Facebook)解説 関数型プログラミングに目覚めた! IQ145の女子高生の先輩から受けた特訓5日間 サポート記事【静的HTML編】React 解説【動的HTML-FRP編】

量子コンピュータが超高速である原理と量子論とそれに至るまでの科学哲学史をゼロからわかりやすく解説01量子コンピュータが超高速である原理と量子論とそれに至るまでの科学哲学史をゼロからわかりやすく解説02

『関数型プログラミングに目覚めた!』のレビュー(Day-1)について

LISPデータ構造の問題点の指摘と抜本的解法としての新プログラミング言語の策定/純粋関数型言語「SPINOZA」

著書『関数型プログラミングに目覚めた! IQ145の女子高生の先輩から受けた特訓5日間』 [Day1]たち読み記事 無料公開中

『関数型プログラミングに目覚めた! IQ145の女子高生の先輩から受けた特訓5日間』を大変多くの方々にお買い求めいただき、感謝します。本書の全目次を公開し、質問を受け付けます。

2016年5月18日水曜日

「これ以上は説明も回答もしない。」という嘘説明のFRPの基本原理コードなるもの

前回のエントリ記事、
本来のFRPを理解せず中傷を重ねる連中への再度宿題
にて、

以下再掲


http://anond.hatelabo.jp/20160516113354

関数型って時間はパラメータで与えて結果を得るんじゃないの

刻々と変化する「現在時間」を抽象化したインデックス

を変数で持ってたら、命令型じゃないの

だとか、

http://anond.hatelabo.jp/20160517022608

それをユーザから見て命令型変数への破壊的代入ではなく
参照透明な関数型インターフェースで実現するのが
いわゆるモナドや(誰かの独自解釈ではない本来の)FRP。

http://anond.hatelabo.jp/20160517023637

ライブラリユーザは現在時刻から状態への写像fを
参照透明な関数なりストリームなりで記述して、
それを処理系が実際のシステム時刻t=0,1,2,…に適用して
状態f(0),f(1),f(2),…を得る、という本来のFRPの基本原理

とか、君独自の勘違いFRPの解釈「本来のFRPの基本原理」で、書けるもんなら、
そのインデックスで、
システム時刻t=0,1,2,…に適用して状態f(0),f(1),f(2),…を得るという本来のFRPの基本原理で、
現在の状態を表せるとするFRP方式で、「お絵かきアプリ」をささっと実装してみせてください。

Date.now()であれ、
__a.tであれ、
「現在時間」というのは、本来的に「それ以外のシンボル」では表現できないので、
どういう魔法を使うのかたいへん興味があります。

以上、「本来のFRP 」を理解しておらず、出来もしない絵空事、机上の空論をあいも変わらず垂れ流してる例の自称関数型コミュニティへの宿題でした。


再掲終わり

と、「宿題」を出したところ、早速反応があったようです。

http://anond.hatelabo.jp/20160517162141

nonstarter氏をはじめもう1年ぐらい前から何度も示されてるんですが(以下無限ループ)

はい、嘘ですね。そんな彼ら独自の主張の路線のFRPコードなどどこにも示されていません。

連中の書き込み、
http://anond.hatelabo.jp/20160518122300
によると、
具体例は以下らしいです(笑)

http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b
main = playBanana disp colour freq gen
https://hackage.haskell.org/package/gloss-banana-0.1.0.4/docs/src/Graphics-Gloss-Interface-FRP-ReactiveBanana.html
playIO display colour frequency ()
(\ _ → readIORef pictureref)
(\ ev _ → () < tick time)
https://hackage.haskell.org/package/gloss-1.10.1.1/docs/src/Graphics-Gloss-Interface-IO-Game.html
playIO display backColor simResolution
worldStart worldToPicture worldHandleEvent worldAdvance
= playWithBackendIO defaultBackendState
display backColor simResolution
worldStart worldToPicture worldHandleEvent worldAdvance
False
https://hackage.haskell.org/package/gloss-1.10.1.1/docs/src/Graphics-Gloss-Internals-Interface-Game.html
, Callback.Idle (callback_simulate_idle
stateSR animateSR (readIORef viewSR)
worldSR (\_ -> worldAdvance)
singleStepTime)
これ以上は説明も回答もしない。

いやあのね、「これ以上は説明も回答もしない」って、そもそもこちらの「宿題」の説明にも回答にもなっておらないわけで、それ以上無理というのなら、まあ「想定の範囲内」で、案の定、適当ないつもの机上の空論だった、ということが、万人に追認される、証明されて、はいここまで終わり、ということで、
これ以上デマを流さない、という諦めの宣言とも取れるので、それは大変歓迎されることです。

一応、連中のハッタリ、嘘を精査して確認、証明していきましょう。

まず、冒頭の、

http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b
main = playBanana disp colour freq gen

これですが、
この書き込みが意図するとこであろう、リンク先
『関数型プログラミングに目覚めた!』のレビュー(Day-1)
の@nonstarter という捨てアカウントによる記事の該当部分は以下です。

ちなみに、大した意味はありませんが、敢えてFRPライブラリ(Reactive-Banana)を使うとこうなります:

ReactiveBananaDrawingCanvas.hs
import Data.Monoid (mconcat)
import Reactive.Banana (accumB)
import Graphics.Gloss.Interface.Pure.Game
import Graphics.Gloss.Interface.FRP.ReactiveBanana (playBanana)

main = playBanana disp colour freq gen
 where
  disp = (InWindow "Drawing Canvas" (400, 400) (40, 40))
  colour = white
  freq = 100
  gen deltaTime = return . fmap draw . accumB (False,[],[]) . fmap eTrans
  draw (_, path, paths) = mconcat $ map line $ path:paths
  eTrans (EventKey (MouseButton LeftButton) Down _ _ ) (_, path, paths) = (True, path, paths)
  eTrans (EventKey (MouseButton LeftButton) Up _ _ ) (_, path, paths) = (False, [], path:paths)
  eTrans (EventMotion pos) (True, path, paths) = (True, pos:path, paths)
  eTrans _ world = world

FRPライブラリを使ってもコードが先のものと殆ど変わらないことに注意してください。要するにこれらのコードの本質は状態遷移を純粋な関数(ここではeTrans)で表現するところにあり、イベントストリームやシグナル・ビヘイビアといったFRP特有の要素を用いるか否かにはないということが示されています。


まず、何度も書いてますが、なんでOCamlで書けないんだ?ってことがあります。
そもそもこちらの投げかけが、ごちゃごちゃ文句言うなら「Ocamlで机上の空論じゃないこと示せ」とかいうのに、いちいちHaskellのライブラリ頼みだっていうのが、語るに落ちる状態を明確に表しています。

さて、コードについてですが、

gen deltaTime = return . fmap draw . accumB (False,[],[]) . fmap eTrans

という行で、deltaTime デルタタイム、つまりここでなんか、タイマーのインターバルとってるっぽいですが、結局、

EventKey (MouseButton LeftButton) Down

とか、やってることは、そのまマウスイベントを流してるだけで、いったいどこに、

http://anond.hatelabo.jp/20160517023637

ライブラリユーザは現在時刻から状態への写像fを
参照透明な関数なりストリームなりで記述して、
それを処理系が実際のシステム時刻t=0,1,2,…に適用して
状態f(0),f(1),f(2),…を得る、という本来のFRPの基本原理

その「システム時刻t=0,1,2…」というインデックスから、
状態f(0),f(1),f(2),…を得るとかいう、彼らの言う「FRPの基本原理」みたいなもんがあるんですかね?(笑

残りは全部、使ってるライブラリのソースコードからfrequencyやリフレッシュレートやら、timerの解像度っぽいことをアピールしてるみたいですが、

タイマーの解像度設定しながらマウスイベントを同時にとってなんかやることと、

実際のシステム時刻t=0,1,2,…に適用して
状態f(0),f(1),f(2),…を得る、という本来のFRPの基本原理

ってまったく違うでしょ?
誤魔化すなと。

@nonstarterの書いたコードのどこに、「実際のシステム時刻t=0,1,2,…」をとった形跡があるのか?
その実際のシステム時刻tのストリームのFRPの値はどこ?
そしてどこに、状態f(t)とし取得している形跡があるのか?ってことです。

そんなもんはどこにも存在しない。
やってるのは、ただマウスイベントからFRP変数に流してるだけ。

まあ無理筋でいつもの、デタラメ、誤魔化しをやって、嘘でもなんでも、その場さえつくろえばいい、という考え方の連中なんで、真面目に受け取る学習者が被害を受ける毎度の害悪行為です。
わかってやってて、こうやって追求されると返しようがないこともわかってるので、
「これ以上は説明も回答もしない。」と予め逃げる予告をしている。

いやいや、あのね、こんなもんは嘘をつくだけ害悪で、こっちがこうやって逐一労力かけて指摘しないと、
思わせぶりのハッタリ行為になんか正しい意味がある、ああそうなんだ・・・
と信じてしまう人がでることをわかってわざとやってるんだろ?
いい加減にしろよと。

0 コメント:

コメントを投稿

Popular Posts