前回のエントリ記事、
本来の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 コメント:
コメントを投稿