...

関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day

by user

on
Category: Documents
146

views

Report

Comments

Transcript

関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
からアーカイブ
archive.is
webpage capture
検索
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b
スクリーンショット
2015年11月4日 03:25:23 UTC
履歴表示 前の 次の
すべてのスクリーンショット, ドメインから qiita.com
からリンクされています ja.yourpedia.org » 岡部健 (荒らし)
ウェブページ
2015/11/05 0:41
シェア
ダウンロード .zip
エラー報告または乱用
0%
Search
News
プライバシーポリシー改訂
Sign up
『関数型プログラミングに目覚めた!』のレビ
ュー(Day-1)
関数型言語 110
JavaScript 7204
!
98
"
Stock
Log in
491
Comment
# Stock
…
nonstarter posted in May 09, 2015(Edited Aug 04, 2015) • Revisions(34) • Create an edit request
79
Day2のレビューとDay3のレビューに続きます。
5
nonstarter
なぜこれを書いているか
私は社会科学分野を専門にしていますが、教育的理由を含む様々な理由から学部1年生から2年生向
けの基礎教育で関数プログラミングの基礎を教えることを考えています(計算機科学の専門家では
ありませんからできることは限られていますが)。私自身の能力的限界から使用する言語はHaskell
かOCamlになると思いますが、そもそもの関数プログラミングについて1年生に教える際に適切な
179 Contribution
%Follow
人気の投稿
• 『関数型プログラミングに目覚めた!』
のレビュー(Day-1)
• 『関数型プログラミングに目覚めた!』
のレビュー(Day-2)
• 『関数型プログラミングに目覚めた!』
のレビュー(Day-3)
教材に関心を持っています。つい最近(2015年4月)刊行された岡部健『関数型プログラミングに
目覚めた! IQ145の女子高生の先輩から受けた特訓5日間』も、そうした関心を以って購読しまし
た。
最初に結論を述べてしまえば、私は本書を学生に読ませようとは思いませんし、率直に言って「ど
うにも困った本だなあ」と思います。しかし、否定的評価にせよその理由を記録しておくことは、
一定の社会的効用を有しうるのではないかと思ってこれを書いています。また、上述のような私個
人の関心から、レビューにあたって特に最初の3章について、かなり細かく感想と評価を書いてい
くことにします。また、その際には本書に関してインターネット上で提示されている疑問点を検討
することにします(煩雑になることを避けるために敢えて引用はしません)。
なぜこれを書いているか
「0∼9までの数をすべて足すコ
ードを書け」について
「0∼9までの数をすべて足すコードを書け」について
このテーマはDay3の終わりまでほぼ200ページ(つまり本書の半分)を占めています。いわゆる命
令型のコード1
[0,1,2,...,9]はダサいか?
フロー(チャート)に対する批判
「問題の論理」?
「関数という論理操作」?
「『まとまり』は美しい単一の論
理構造」?
imperative_sum.js
var!s!=!0;
for!(var!n!=!0;!n!<!10;!n++)
{
!!s!=!s!+!n;
}
まとめ
続くかどうか
追記(2015/05/30):デスクトップ
アプリケーション??
console.log(s);
2
https://archive.is/r4i8e
1/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
と関数型のコード2
functional_sum.js
var!plus!=!function(a,!b)
{
!!return!a!+!b;
};
var!s!=![0,!1,!2,!3,!4,!5,!6,!7,!8,!9]
!!.reduce(plus);
console.log(s);
が対比されています。
[0,1,2,...,9] はダサいか?
本書に対する感想として幾つか見かけたものに、「関数型コードの [0,1,2,...,9] という配列リテ
ラルベタ書きの方が命令型コードよりダサいではないか!」というものがありました(0∼999まで
足せと言われたらどうするつもりなのか!)。しかし、まさに0∼999まで足すにはどうしたらいい
のだろう、という問いを本書の登場人物自身が問い(p. 45)、配列リテラルではなく range 関数を使
って配列[0..999]を生成するコード例が示されます(p. 109) 3。ですので、何度も繰り返されるコード
例 [0,1,2,3,4,5,6,7,8,9].reduce(plus) のダサさは本書にとって本質的なものではありませ
ん。
ただ、容易に予想できる反応でもあるので、最初に「配列として与えられたデータ [13, 5, -6,
34, 9, -17, 8, 21, 7] の和を求めるコードを書け」というような例にしておけばよかったのに、
とは思います。
(追記:と思ったのですが、プロフェッショナルな関数プログラマからは下記のような評価になる
ようです。
らくだの卯之助
@camloeba
フォローする
0 から 9 まで列挙した配列、この本の問題として本質的ではな
いという意見。しかし、この例を選んでしまっているところに
リスト、配列、空間コスト、評価戦略などの関数型プログラミ
ングの大切な概念に対する無理解が見て取れるため極めて象徴
的であるのです
2015年5月9日 00:43
4
11
素人としては深入りを避けたいと思いますが、そうだとすればそもそもJavaScript選んじゃったの
が関数プログラミングへの無理解を象徴的に示すものなのだということになるような気がしま
す。)
フロー(チャート)に対する批判
最初に引用した命令型コードに対応するフローチャートが掲出され(pp. 9, 25, 52, 269)、そのフロ
ーチャートを見てそれが0∼9までの数を足せ、という問題の正しい解になっていることを確信でき
る人間は殆どいない、という主張がなされています(p. 9)。
そのことに異論はありません。が、 for 文を使った元の命令型コードそのものであれば、少なから
https://archive.is/r4i8e
2/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
そのことに異論はありません。が、 for 文を使った元の命令型コードそのものであれば、少なから
ぬプログラマはそれが正しい解だと思うのではないでしょうか。(JIS規格に従った)フローチャ
ートには for 文にそのまま対応する記法があるにも拘らず、敢えてそれを使用せず、よりprimitive
な記法でフローチャートを書けば、わかりにくくなるのはある意味では当然です(そもそも for 文
は一定の抽象化・構造化を与えるものなのですから!) 4。これは命令型に慣れた人からは不適切
な藁人形論法に見えるでしょう。
(あと、そもそもの問題としてJavaScriptで「フローは不要」なんて不可能事そのものなんではと
いう疑問はさておき。5)
「問題の論理」?
p. 12で初出のこの「問題の論理」というタームはその後に繰り返し出てきます。が、その意味する
ところは良くわかりません。既出の関数型コードは「単純に問題の論理そのものをコードへまる写
しているだけ」&「そしてそれがクールなコードを書く唯一の方法だ」ということなのですが、そ
れは「0∼9までの数をすべて足せ」という要求をそのままコードで表現すればいいのだ(そこには
ループや途中の計算結果の受け渡しなんか出てこない)&そうしたコードのみがクールなんだ、と
いうことのようです。
しかし、たとえば「与えられた配列 s をソートせよ」という問題を与えられたらどうするんでしょ
うか。 s.sort(isGreater) と書け、ということなんでしょうか。肝腎のその sort() はどうやって
書けばいいのかは、およそ「問題の論理」からは出てこないように思います。或いは更に「与えら
れた配列を時間量O(n log n) でソートせよ」という「問題の論理そのもの」をどう「コードへまる写
し」すればクイックソートやマージソートなどの各種のソートが得られるのでしょうか? どうやら
「クールなコード」を書こうとする限り、ソートを行うコードを書くことはできないようです 6。
とすると、「神の目」はどうやら役立たずだということになるでしょう。
「関数という論理操作」?
次に問題になるのは、p. 15の「関数という論理操作」です。相変わらず「論理操作」という語が何
を意味するのかはよくわかりません。
!!炊飯器
米と水!>CCCCC>!炊飯器(米と水)!=!炊きたてのご飯
の「炊飯器(米と水) = 炊きたてのご飯」という関係が「論理操作の関係」なんだそうです。「関数
というものは作用して変化させる、という論理操作」なんだとか (p. 19)。正直なところ私はもう既
について行きかねているのですが 7、しかし、重大な問題がここには潜んでいるように思います。
まず、炊飯器が米と水をご飯に変化させるのは「因果的作用」です。更に、米と水に炊飯器を因果
的に作用させると、米と水はご飯に変化し、もとの米と水はなくなってしまいます。他に例として
挙げられているのが家の改造(Before After)であるところからして、著者のいう「作用して変化さ
せる」が因果的な作用による物理的変化のそれであるということは一貫しており、そこでは、
outputが得られた時にはinputは消滅しています。
しかしながら、ということは、これが関数プログラミングでいう「関数」に対応するものではない
ことは明らかです。 x = 1; y = foo(x); は x に foo を作用させてoutputである y を得ています
https://archive.is/r4i8e
3/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
が、 x は foo によってもちろん消滅したり変化したりはしません(もし変化してしまうならばそ
の foo は副作用を持っており、関数プログラミングが基本的構成要素とするところの意味での「関
数」にはなりません)。
このことは、著者の「関数」のイメージが、関数プログラミングでの「関数」と食い違っているこ
とを示しています。関数プログラミングでいう「関数」は数学的意味での関数、つまり、「写像
」であって、あくまでも始域
f:A→B
A
の元と終域 B の元との 対応関係 のことであり、そこには(始
域の元が終域の元に「なる」というような)「変化」などというものはありません。
「『まとまり』は美しい単一の論理構造」?
さて最後に「論理構造」です。相変わらずよくわからないのですが:
[0,1,2,3,4,5,6,7,8,9] // 0から9までの数 というのは『まとまり』なの。[……]『まとま
り』というのは、まとまっているのだから極めて単純で美しい論理構造なの。『まとまり』
という単一の論理構造は、これ以上分割する余地はない。(p. 28)
「まとまっているのだから極めて単純で美しい論理構造なの。」の「∼のだから」がもうさっぱり
わからないのですが、そこを措くとしても、果たしてこの「論理構造」というのは何のことなんで
しょうか。0∼9の『まとまり』と一口にいっても、集合
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
とn-組⟨1, 2, 3, 4, 5, 6, 7, 8, 9⟩ は違うわ
けだし、木構造でまとまってたりしたらどうするのでしょうか。これらの違いを考えるにそれぞれ
「極めて単純で美しい」というには偉いこと「構造」が入っているように思うわけです。
そもそも「分割する余地はない」のなら、分割できませんよね。ということはリストや木を始めと
した再帰的データ構造はここでいう「論理構造」には入らないということになりましょう。そうす
ると、『まとまり』とは単純に集合のことなんでしょうか。それだって部分集合とか考えたら「分
割」できますけど(部分集合は「論理的」じゃなかったりするんでしょうか)。
なにより、 [0,1,2,3,4,5,6,7,8,9] みたいなデータに対してなにかする際に(たぶん「論理操
作」というてやつですね)それを「分割する余地はない」とか言われたら構造に対する再帰も使え
ないわけで、関数プログラミングで肝腎の reduce 関数を定義することすらできません。お説に従
えば、Haskellでお馴染みのパターンマッチによる構造分解による:
r!f!i!(x:xs)!=!r!f!(f!i!x)!xs
みたいな関数プログラミングのイディオムみたいなものも曰く「ダサい」コードとなってしまうの
であって、およそ関数プログラミングをどうやって遂行したものか途方に暮れるしかありません。
まとめ
Day1に出てくる「問題の論理」「論理操作」「論理構造」といったキーターム(らしきもの)の内
実はさっぱりわかりません。特にどれも「論理」という語を含んでいる辺りが問題で、いったいこ
の3つに何か共通する要素としての「論理」なる何事かがあるのでしょうか?
そのような「論理」なるものの説明が与えられないままに、「問題の論理」「論理操作」「論理構
造」といった表現を並べられても、関数プログラミングを関数プログラミングよりも不明瞭な何事
https://archive.is/r4i8e
4/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
かで説明しようという無益な試みになるしかない、というのがDay1についての率直な感想です。
また著者の主張をそのまま信ずるならば、現実に行われている関数プログラミングの多くが「ダサ
い」ものだという事になりますが、翻って、著者が「クールなコード」と認めるようなものでどれ
ほどの関数プログラミングができるかは極めて疑わしいということになるでしょう。
続くかどうか
本書で最もreadableなDay1ですら、改めて読み返したところひどく疲れてしまいました。Day2に
ついて、すぐに続きを書くことは難しいでしょう。
(続きを書きました )
追記(2015/05/30):デスクトップアプリケーション??
著者はブログで@camloebaさんや@esumiiさんにデスクトップアプリケーションをOCamlで作成す
るように求めているようです。著者が挙げている「クリックカウンター」や「お絵かき」の類を作
成するのに特別なexpertiseは不要で、単に使用するGUIライブラリ・グラフィックスライブラリの
ドキュメントが読めれば充分なので、その趣旨は私にはまったく判然としません(当該の記事で著
者がOCamlで「お絵かきロジック」を実装してみせよと要求する一方で自身ではJavaScriptによる
それを公表していない点も気になります)。もちろん、OCamlであれHaskellであれ破壊的代入の類
の副作用を使用せずに書くのもなんら困難ではありません。
(追記:コメント欄にてyataketa9056さんに、既存のGUIライブラリを前提にスケールするコード
を書こうとするとOCamlでは困難であろうという指摘を頂いています。利点はともかくHaskellと同
じようにモナドを利用したライブラリを作成するなら純粋な関数型でのプログラミングも可能にな
る(けれどもOCamlプログラミングとしてはわざわざそのようなことをしても嬉しくはない)とい
うことになります。とはいえ原理的に不可能でないのなら(そして不可能でないので)、純粋な関
数プログラミングでGUIアプリケーションを作成するのにFRPがなんら必要でない、という趣旨に
は充分です。またこの主張自体はHaskellでのコードによっても充分に示されています。)
クリックカウンターはHaskellでOpenGLに対するラッパーであるGlossライブラリを使うならばこ
うなります(手元の環境でインストールしやすかったのでこれを使いました):
ClickCounter.hs
import!Graphics.Gloss.Interface.Pure.Game
main!=!play!disp!colour!freq!ini!draw!eTrans!tTrans
!where
!!disp!=!(InWindow!"Click!Counter"!(225,!150)!(40,!40))
!!colour!=!white
!!freq!=!100
!!ini!=!0
https://archive.is/r4i8e
5/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
!!ini!=!0
!!draw!=!!Translate!(:75)!(:50)!.!Text!.!show
!!tTrans!_!n!=!n!
!!eTrans!(EventKey!(MouseButton!LeftButton)!Up!_!_!)!n!=!n!+!1
!!eTrans!_!n!=!n
お絵かきアプリも難しいところはなにもなく、ドラッグ中かどうかのフラグをマウスボタンの上下
で切り替えて管理し、フラグを状態遷移関数(状態とイベントをとって状態を返す純粋な関数)の
引数として渡していくだけです。
DrawingCanvas.hs
import!Graphics.Gloss.Interface.Pure.Game
import!Data.Monoid!(mconcat)
main!=!play!disp!colour!freq!ini!draw!eTrans!tTrans
!where
!!disp!=!(InWindow!"Drawing!Canvas"!(400,!400)!(40,!40))
!!colour!=!white
!!freq!=!100
!!ini!=!(False,![],![])
!!draw!(_,!path,!paths)!=!mconcat!$!map!line!$!path:paths
!!tTrans!_!w!=!w
!!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!_!w!=!w
いずれにせよ、状態機械の数学的構成では状態遷移が状態と入力から状態への関数として表現され
るというだけのことではあり(状態渡し)、状態遷移が複雑になれば状態遷移を純粋な関数として
表現する作業も複雑になり困難になるので(そしてそれはしばしば綺麗な関数合成では上手くいか
ないようなものになることが多いので)、結局のところ少なくとも現状のFRPも(イベントのシグ
ナルから状態のシグナルを構成する際に状態遷移をそうした関数で表現する必要が出てくるので)
本質的には銀の弾丸にはならないと言わなければなりません(関数プログラミングで書けるという
ことの恩恵はもちろんあるとしても)。
ちなみに、大した意味はありませんが、敢えて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
https://archive.is/r4i8e
6/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
!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特有の要素を用いるか否かにはないという
ことが示されています。
1. (pp. 7, 52, 86, 133, 141) なお以下のコード例の引用についても同様ですが、本書のコードはMITライセンスで
す(©2015 Ken Okabe)。なお、(読みにくい気がしますが)波括弧の位置はママです。
2. (pp. 8, 11, 12, 14, 27, 29, 43, 46, 54, 86, 108-9, 152-3)
3. なんで64頁も間が空くような構成にしたのか、という気はしないでもありません。
4. なお、まったくの未経験者にとっては命令型コードの方がわかりにくいと思いますし、関数型コードのほうが
自然であると思います。だからこそ学生に関数型言語でのプログラミング入門を提供しようかと思っているわ
けですから。
5. もっとも単純な例を挙げれば、JavaScriptでコードを並べる順番や位置を
闊に変えるとマズいことが色々と
起きますよね(たとえば前方参照だのシャドウイングだの)。そしてそれはJavaScriptが実行される際の制御
フローそのものから生じている問題です。
6. 言うまでもないことですが、各種のソートアルゴリズムは純粋に関数型コードで書くことができますし、それ
ぞれのソートアルゴリズムの実行効率もピンからキリまで異なったものになります。ということは、つまると
ころ関数プログラミングはどうやら「問題の論理そのものを書き写す」ということには存しないということに
なります。
7. 「論理操作」という語を敢えて私が理解しようとすれば、「 p とp ∧ q からqを推論する」とか「p → qから¬q → ¬pを推
論する」とかといった論理的に妥当な推論の遂行、ということになるのですが、明らかにそういう意味では使
われていません。
& Linked from these articles
Linked from
『関数型プログラミングに目覚めた!』のレビュー(Day-2) 6 months ago
Linked from
『関数型プログラミングに目覚めた!』のレビュー(Day-3) 6 months ago
PR
社内メールでの情報共有をなくそう - Qiita:Team
questa
0 contribution
May 26, 2015 23:12
'Thank
こんにちは。
私は現在、関数型プログラミングを勉強している者で、まさにこちらの記事で批評されて
いる書籍を読んで、思考を切り替えるためのコツを分かり易く学べたと考えている者で
す。
https://archive.is/r4i8e
7/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
様々な視点から学び、理解を深めたいと考えており、こちらの記事も目を通し、関心を持
って注目しております。
御記事の批判の仕方でよく分からない点があります。
例えば「関数という論理操作」?段落において、 x = 1; y = foo(x); という例を挙げ
られていますが、これはいかにも命令型の発想で、関数型においてはただ foo(x) が宣言
的に記述されていくのではないでしょうか。
その時、当然 x の消滅や変化は問題になりませんし、返り値は foo(x) として普通に利
用できます。つまり、アプリケーション上では「炊飯器(米と水)」と宣言的に用いていく
のが関数型であり、
米や水が消えたかどうかなどという問題意識は、 x がどうだ、 y はどうなったという、
いかにも状態変数に振り回される命令型特有のものではないでしょうか。
この発想をもとにした批判自体、書籍のテーマからずれていて的外れなように思われま
す。
実は、著者ブログでこちらの記事が間違いだらけであると指摘されています。
社会的効用の点を配慮されているとのことですので、是非このような反論にも答えていた
だき、小生並びに関数型プログラミングを志す他の勉学者様達のためにお力添えいただけ
ましたら幸いです。
関数型プログラミングと私の著書の正確性についてきちんと議論(論争)します。
http://kenokabe-techwriting.blogspot.jp/2015/05/blog-post.html
『関数型プログラミングに目覚めた!』のレビュー(Day-1)について
http://kenokabe-techwriting.blogspot.jp/2015/05/day-1.html
(反論記事はまだ続くようです)
nonstarter
179 contribution
May 27, 2015 00:23
'Thank
コメントどうもありがとうございます。このレビューについてはこれ以降特に大きく手を
加えるということはなくそのままにしておくつもりですが、ともあれ頂いたコメントにつ
いて簡単にだけ。プログラミング自体について初心者だということはない、という前提で
お話させていただいても構いませんよね(たぶん)。
例えば「関数という論理操作」?段落において、 x = 1; y = foo(x); という例を
挙げられていますが、これはいかにも命令型の発想で、関数型においてはた
だ foo(x) が宣言的に記述されていくのではないでしょうか。
申し訳ありませんが、仰っていることの意味が私にはまったく判然としません。 x = 1 は
再代入を許さない関数型プログラミング言語でもありふれた変数束縛で、別に命令型でも
なんでもありません。 y = foo(x) も変数束縛ですが、 foo が引数 x や評価環境に対する
影響を与えない限り(つまり副作用を持たない限り)参照透明であって、関数プログラミ
ングにとって特になにも問題ありません。「ただ foo(x) が宣言的に記述されていく」と
https://archive.is/r4i8e
8/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
ングにとって特になにも問題ありません。「ただ foo(x) が宣言的に記述されていく」と
いうご趣旨が、仮にもし、コード中に
foo(x);
とだけ書かれた箇所が出てくるというものだとすると、 foo(x) は単に評価されて値が返
ってきますが、その値は(たとえば新たに変数 y をそれへと束縛したりせず)どこでも利
用されないのですから、 foo(x) が副作用を持たない限りは、このコードは消去可能にな
ります。つまり、もし上記のようなご趣旨だとすれば、(このコードが消去可能な無意義
なものでない限りは)むしろそちらの方が副作用を用いた非関数型の発想だということに
なります。
その時、当然 x の消滅や変化は問題になりませんし
問題になります。関数プログラミングを実施するためには x に変化してもらっては困るの
ですから。もちろん、破壊的更新や入出力などの副作用のない純粋な関数型コードを書い
ている限り x が消滅・変化しないことは当然のことですから、その意味では「消滅・変化
は問題になりません」けれど。
返り値は foo(x) として普通に利用できます。
これはそれ自体では間違っているわけではありませんが、新たな変数(たとえば y )を束
縛できないとすると、関数定義もできませんし、プログラム全体を
kaz(x,(...!yam(1729,baz("abc",bar(foo(x),[1,2,3]),false))!...),57)
のようなひとつの巨大な関数適用の入れ子で書かなければならなくなりますよ。関数適用
の構文が簡潔な関数型プログラミング言語なら(たとえばHaskellなら)、ごく小さなプ
ログラムであるかぎりこうした書き方も非現実的ではなくしばしば用いられますが 1、
JavaScriptでは面倒でしょう。
つまり、アプリケーション上では「炊飯器(米と水)」と宣言的に用いていくのが関数
型であり、
「アプリケーション上では」や「宣言的に」という言葉がどういう意味で用いられている
のかが私にはわかりませんが、関数プログラミングで変数束縛を使うことは(それが書換
不能であるかぎり)別に問題はありません。
米や水が消えたかどうかなどという問題意識は、x がどうだ、 y はどうなったとい
う、いかにも状態変数に振り回される命令型特有のものではないでしょうか。
x が foo(x) の前後で不変でないと参照透明性が保たれず、 x は可変な状態を持ってしま
うことになります。ですから、炊飯器に投入された「米や水」が、炊飯の前後で変化・消
滅せず、炊飯後もなお変わらず利用できるのでなくてはこまるのです(そしてそんな不思
議な米や水や炊飯器は存在しませんからこれらは喩例としてまったく不適切です)。こう
した不適切な喩えを持ちだしたのは著者であって私ではありません。私はそもそもその喩
えが不適切なのでやめるべきだ、と言っているわけですから「米や水が消えたかどうかな
どという問題意識は……命令型特有のものではないでしょうか」と言われても困ります。
https://archive.is/r4i8e
9/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
どという問題意識は……命令型特有のものではないでしょうか」と言われても困ります。
私は「米や水や炊飯器」で関数プログラミングに於ける「関数」を理解しようとしたこと
がそもそもありませんから。
社会的効用の点を配慮されているとのことですので、是非このような反論にも答え
ていただき、小生並びに関数型プログラミングを志す他の勉学者様達のためにお力
添えいただけましたら幸いです。
「社会的効用」を配慮するからこそ、著者の「反論」と称する長大な日本語文に対して特
に反応をする気はありません(それこそが本書や著者のような擬似科学的言説に対する唯
一可能な対処だからです)。私は著者がこのレビューによって自己の見解を修正するなど
ということをまったく期待していません。このレビューを書く前に確認した限り、本書に
対するインターネット上での批判的なレビューや反応に対する著者のブログでの「応答」
ないし「反論」は殆ど意味を成さないほど不明瞭か、明確に誤っている・的が外れている
ものばかりでした。本書の様々な記述から私は著者が関数プログラミングについて基礎的
な事項すらおよそ理解できていない、という結論に達しました。その理由はDay2のレビ
ューとDay3のレビューをご覧になればお分かり頂けるでしょう。ほかにも、著者が本書
の執筆期間にStackOverflowというサイトに投稿した質問( reduce を map で定義するに
はどうしたらいいかという質問です)を見れば、著者が map と reduce について何も理解
しないままに本書を執筆していたことは明らかです。 map の適用結果が必ずリストや配列
になることから reduce が map に単に何らかの関数を渡すだけでは作れないことも(もち
ろん map で得たリストから更に要素を取り出していいなら型が合わせられるので作れます
が2)、逆に reduce を用いて map をどう定義すればいいかも関数プログラミングの勉強を
始めたその初っ端に出会う練習問題に過ぎないような本当に基本的な話題に過ぎません。
このような著者に対して関数プログラミングに関して技術的になにか意味のある「反論」
を期待することはできず、つまるところ本書と著者についてはもはやこれ以上なにをしよ
うもないのです。
このレビューは著者ではなくあくまでも既に本書を読んで疑問を感じた読者や、これから
読むかもしれない可能的読者の一助となるべく書かれていますし、それ以上でも以下でも
ありません。私のこの一連のレビューよりも本書と著者の反論に説得力があると判断され
るのであれば、このレビューを無視するかないし批判的な反論をご自身でどこかで展開さ
れるのがよいと思います(必然的に長大になってしまうでしょうからこのレビューのコメ
ント欄ではない別のところで展開してそこからリンクを張っていただく形でお願いします
ね)。
いずれにせよ、関数プログラミングに不案内なquestaさんに対してここで私にできること
は、本書をいっさい忘れて、たとえば浅井健一『プログラミングの基礎』、サイエンス
社、2007年、のようなきちんとした入門書を読むことをお薦めすることだけです(これは
このレビューの冒頭に述べた私が実施を計画している講義で採用することを検討している
最有力の教科書です)。
1. このようなごく簡単なプログラミング課題であれば途中で変数束縛を用いることなくプログラム全
体を一本の関数適用の連鎖のみで書くことも別段難しくありません(もしHaskellで書くとどうなる
かを知りたければ聞いてください)。JavaScriptでそうしたスタイルで書こうとするとどうなるか
はquestaさんが自身で試みて見られるとよいのではないでしょうか。本書で「思考を切り替えるた
めのコツを分かり易く学べた」とのことですから、途中で変数束縛を用いずにプログラム全体を関
数適用の連鎖のみで宣言的に書くことは別段難しいことはないものと期待します。
2. まず scanl に相当するものを myScanl f r xs = ys where ys = r : zipWith f ys xs とし
https://archive.is/r4i8e
10/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
2. まず scanl に相当するものを myScanl f r xs = ys where ys = r : zipWith f ys xs とし
て作ります。 zipWith f ys xs を map を使って書き換えれば map (\(x,y) -> f y x) (zip
xs ys) となりますから、 myScanl f r xs = ys where ys = r : map (\(x,y) -> f y x)
(zip xs ys) となります。 scanl で得られたリストの最後の要素が foldl つまり reduce の結果
になりますから、 reduce f r xs = last ys where ys = r : map (\(x,y) -> f y x)
(zip xs ys) で望みのものが得られます( reduce (+) 0 [1..9] → 45 )。ただし、このよう
にまわりくどい(余)再帰的定義ではなく、簡明な普通の再帰で書くべきです(遅延評価を利用し
てリストを構成しているので一般性に欠けますし、この方法はJavaScriptの配列には使えないので
そもそも著者の役にはたちません)。
Lambada
May 30, 2015 11:03
'Thank
0 contribution
本書の数々の重大な誤りに対し正当な技術的批判を加えても
著者から激しい
謗中傷行為を受けるようですので匿名で失礼します。
OCamlで変数への破壊的代入を行わないでごく簡単に書くと以下のようになります。
(通常のOCaml環境ではwait_next_eventを用いるべきですが、
http://try.ocamlpro.com で動くようにloop_at_exitを用いています。
後者ではChromeもしくはFirefox推奨です。)
clickcounter.ml
(*#クリックカウンター#*)
open!Graphics
let!()!=!open_graph!"!900x600"
let!rec!k!c!=
!!clear_graph!();
!!moveto!450!300;
!!draw_string!(string_of_int!c);
!!loop_at_exit![Button_down]!(fun!event!:>!k!(c!+!1))
let!()!=!k!0!;;
mousedrag.ml
(*#マウスドラッグ#*)
open!Graphics
let!()!=!open_graph!"!900x600"
let!rec!k!=!function
!!|!`Up!:>
!!!!!!loop_at_exit![Button_down]!(fun!event!:>
!!!!!!!!k!(`Down(event.mouse_x,!event.mouse_y)))
!!|!`Down(x,!y)!:>
!!!!!!loop_at_exit![Button_up]!(fun!event!:>
!!!!!!!!moveto!x!y;
!!!!!!!!lineto!event.mouse_x!event.mouse_y;
!!!!!!!!k!`Up)
let!()!=!k!`Up!;;
いずれも岡部氏の主張とは正反対に、ストリームなどまったく用いず
状態渡しで実現されています。
逆に、岡部氏のコードはよく見ると state = x; という部分で
カウンタ変数への破壊的代入を行っており、何ら関数的ではありません。
(無駄に複雑なスパゲッティ・プログラムですが、よく読むと要するに
state = state + 1; と同じ破壊的代入です。)
ご参考になれば幸いです。
追記:岡部氏が最近のブログエントリで、上述のプログラムは再帰を使っているので「即
効で」スタックオーバーフローすると主張していますが、関数型プログラミングの基本の
一つである末尾再帰なので、スタックオーバーフローしません。もし仮に末尾再帰がスタ
https://archive.is/r4i8e
11/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
一つである末尾再帰なので、スタックオーバーフローしません。もし仮に末尾再帰がスタ
ックオーバーフローするJavaScript処理系があったとしたら、JavaScriptか、少なくとも
その処理系が、関数型プログラミングに不適切です。
岡部氏は上述のプログラムを無限ループに書き換えて「Chromeタグ(原文ママ)の反応
がなくな」ったと主張していますが、無限ループにしたら反応がなくなって当然です。な
お、少なくとも私の手元のChromeやFirefoxでは、無限ループする末尾再帰ですら(当然
ながらブラウザの反応は重くなりますが)スタックオーバーフローは再現しません(メモ
リ消費量も特に増えません)。岡部氏がスタックオーバーフローと主張している画面には
「Either Chrome ran out of memory or the process for the webpage was terminated for
some other reason」(Chromeのメモリがなくなったか、もしくは何らかの他の理由で
Webページのプロセスが終了されました)とあるので、スタックオーバーフローではな
く、無限ループしているプロセスを強制終了した等かもしれません。
なお、他の方々から、Graphics.loop_at_exitではなく、ネイティブなOCaml処理系であれ
ばGraphics.wait_next_eventを、js_of_ocamlであればGraphics_js.loopを用いるべきとの
ご指摘をいただきました。そのとおりなのですが、元の文で述べたとおり、最も手っ取り
早く試していただけるTry OCamlで動くよう、Graphics.loop_at_exitを用いました。ま
た、そもそもTry OCamlのGraphics.loop_at_exitやjs_of_ocamlのGraphics_js.loopはループ
でも再帰でもなく、イベントハンドラの登録を行なって戻ってくるだけなのでスタックオ
ーバーフローなど起こるわけがない、とのご指摘もいただきました。ありがとうございま
す。
nonstarter
179 contribution
May 30, 2015 11:18
'Thank
Lambadaさん
著者の主張に対する反例となるOCamlコードをお示しいただきどうもありがとうございま
す。私の手元でも問題なく動作しました。
デスクトップ云々の件もそうですが、ブログを含む著者の一連の主張は明らかに誤ったも
のであることが多く、いったい何がしたいのかを忖度することがおよそ困難であるように
思います。やはり、いちいち誤りに反応せず、放っておくのが正しいのでしょうか。初心
者の方が早期に問題に気がつけばいいのですが。
nonstarter
179 contribution
May 31, 2015 11:27
'Thank
hiyakashi_さん
マウスポインタの現在位置を表示するというような、先行するイベントに依存しない処理
のみの場合には状態を渡して云々は特にありませんが、先行するイベントに依存するよう
なある程度複雑な処理をしようとすれば、どうしても状態とイベントから状態への純粋な
関数を使って、シグナル(特にイベントのストリーム)を畳み込んで状態のストリームを
得ていくことになりますよね(FRPを支援する代表的な関数型プログラミング言語Elm
の foldp : (a -> state -> state) -> state -> Signal a -> Signal state がまさ
にそれです)。
ElmClickCounter.elm
https://archive.is/r4i8e
12/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
clickCount!:!Signal!Int
clickCount!=!foldp!(\click!total!:>!total!+!1)!0!Mouse.clicks
一定以上に複雑なものを関数型スタイルで書こうとする場合には、状態遷移を純粋な関数
として表現するという手法をFRPそれ自体によって免れることはできません(私が理解す
る限りでは)。
私の結論は、著者であるkenokabeさんの言葉を額面通り受け取れば、彼はFRPを理解し
ていないのだろう(或いは少なくとも foldp のような畳込みが必要になるような一定以上
に複雑なFRPを経験したことがないのだろう)、というものです。
GUIアプリケーションの構築に際して、IOモナドによるプログラミングがうまくいく/う
まくいかないその程度に、現状のFRP(念頭においているのはElmですが)もうまくいく
/うまくいかないだろう、と私は考えています。
Lambada
0 contribution
May 31, 2015 15:37
'Thank
岡部氏は
『関数型プログラミングのパラダイム内で、そういうマウスボタンが押されているのか、
押されていないのか?入力の状態が時間遷移していく場合、上記ブログエントリでも論じ
たSICPでも、拙書でも解説しているとおり、FRPの実装が必ず必要となります。
「時間」が本質的だから、時間をを集合、SICPの言葉でいえば「遅延ストリーム」とし
た実装が必要です。』
と断言しているにも関わらず、現に私やnonstarter氏のコードのように
「時間」も「ストリーム」も出てこない関数的状態渡しによる実装が
容易である以上、岡部氏の誤りは明らかだと思います。ご参考まで。
nonstarter
179 contribution
May 31, 2015 19:28
'Thank
hiyakashi_さん
著者がFRPを実施しているとは言えないと私は考えています(ブログに掲出されたクリッ
クカウンターのコードでカウンター用の変数を破壊的に更新していることに鑑みて
も)。 foldp については、以前に私がElmを試した際に foldp に渡す関数がやたらと複雑
化・肥大化してしまったことの印象が強いせいもあるのでしょう。私の扱い方がヘタクソ
だっただけかもしれません。私はシグナルのもっとも重要な用途が状態の保持であると思
っているので、先行する状態に依存する状態を与えるために必要な foldp (やその相当
物)がFRPにとって非本質的だとは思っていません。
ともあれ、ご指摘に対応して本文の該当箇所には手を加えました。
Lambadaさん
ご指摘についてはその通りかと思います。
https://archive.is/r4i8e
13/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
【備忘的メモ】
特に意味はないが、敢えて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,![],!p
ath:paths)
!!eTrans!(EventMotion!pos)!(True,!path,!paths)!=!(True,!pos:path,!paths)
!!eTrans!_!world!=!world
nonstarter
179 contribution
Jul 08, 2015 11:34
'Thank
気づきにくいといけませんので、上にあるLambadaさんのコメントの追記部分を転記させ
ていただきます:
追記:岡部氏が最近のブログエントリで、上述のプログラムは再帰を使っているの
で「即効で」スタックオーバーフローすると主張していますが、関数型プログラミ
ングの基本の一つである末尾再帰なので、スタックオーバーフローしません。もし
仮に末尾再帰がスタックオーバーフローするJavaScript処理系があったとしたら、
JavaScriptか、少なくともその処理系が、関数型プログラミングに不適切です。
岡部氏は上述のプログラムを無限ループに書き換えて「Chromeタグ(原文ママ)の
反応がなくな」ったと主張していますが、無限ループにしたら反応がなくなって当
然です。なお、少なくとも私の手元のChromeやFirefoxでは、無限ループする末尾再
帰ですら(当然ながらブラウザの反応は重くなりますが)スタックオーバーフロー
は再現しません(メモリ消費量も特に増えません)。岡部氏がスタックオーバーフ
ローと主張している画面には「Either Chrome ran out of memory or the process for
the webpage was terminated for some other reason」(Chromeのメモリがなくな
ったか、もしくは何らかの他の理由でWebページのプロセスが終了されました)と
あるので、スタックオーバーフローではなく、無限ループしているプロセスを強制
終了した等かもしれません。
なお、他の方々から、Graphics.loop_at_exitではなく、ネイティブなOCaml処理系
であればGraphics.wait_next_eventを、js_of_ocamlであればGraphics_js.loopを用い
るべきとのご指摘をいただきました。そのとおりなのですが、元の文で述べたとお
り、最も手っ取り早く試していただけるTry OCamlで動くよう、
Graphics.loop_at_exitを用いました。また、そもそもTry OCamlの
Graphics.loop_at_exitやjs_of_ocamlのGraphics_js.loopはループでも再帰でもなく、
イベントハンドラの登録を行なって戻ってくるだけなのでスタックオーバーフロー
など起こるわけがない、とのご指摘もいただきました。ありがとうございます。
https://archive.is/r4i8e
14/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
なお、私も単なる素人ですし不適切なことを書いているだろうとは思いますが、今回の
kenokabeさんの一連の主張を見ると流石に私ですら真面目に取り合う必要を感じませ
ん。しかしkenokabeさんがどのような理解の水準で関数プログラミングに関する書籍を
執筆し(てしまっ)たのかが著者ご本人のお蔭で完全に明らかになったように思います。
ですので、hiyakashi0さん(hiyakashi_さんとは違う方だという理解でよろしいですか?
※)におかれましても、kenokabeさんのブログの今後の展開をわざわざお知らせいただく
には及びません。Day1∼Day3までの一連の記事はこれ以降そのまま置いておくつもりで
す。
※追記:その後、別人であるというコメントを頂いていました。
nonstarter
179 contribution
Jul 10, 2015 09:29
'Thank
なにをお考えなのかはさっぱりわかりませんが、hiyakashi0さんは同内容のコメントを削
除して何度も投稿し直す変わった趣味でもおありなんですか? それとも、どうあっても
自分のコメントが記事の最後尾にあってほしいがためだけにそういうことをなさってるん
でしょうか。 hiyakashi0さんに対して読者には一定の印象が形成されることでしょう
し、面倒ですのでこのまま置いておきますけれども。
yataketa9056
0 contribution
Jul 11, 2015 04:27
'Thank
幾つか補足と、間違いがありますので指摘します。
末尾呼出最適化は ECMAScript6 で導入されていますが、これをサポートする JS 実装は
現在ほとんどないはずです。
js_of_ocaml 系のコードが末尾再帰でもスタックがあふれないのは、js_of_ocaml のコンパ
イラが末尾再帰呼出(全ての末尾呼出しではない)を goto やトランポリンで置き換えている
からです。Scala の末尾再帰呼出が JVM 上でやはり同じようにコンパイルされているはず
です。
OCamlでは「破壊的代入の類の副作用」を使用せずに一般の GUI アプリケーションを書
くのはほとんど無理でしょう。なぜなら OCaml の全ての GUI ライブラリは状態は副作用
を使うことを前提にメインループが設計されているからです。これを乗り越えるとすると
@Lambada さんのようにメインループ自体を自分で書く事になり、一般的にはスケール
しません。Haskell の GUI ライブラリでは普通は状態は State なり IO を含む GUI モナド
を使って書く事になりますが、そのような GUI ライブラリを OCaml 上で作れば同じよう
な事が出来るはずです。OCaml でそこまで純粋関数型のコードを書く事に実用的意味が
あるとは思えませんが。
なお上の事は kenokabe の関数型言語に対する歪んだ理解の原因の一つは、末尾最適化の
ない JavaScript 実装を使う事に固執したためであるという事も意味します。彼がこのコメ
ントを嬉しそうに引用しているようですが、さっぱりわかりません。彼は自分の論の整合
性は最早どうでもいのでしょう。残念なことです。
https://archive.is/r4i8e
15/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
nonstarter
2015/11/05 0:41
Jul 11, 2015 07:50
'Thank
179 contribution
yataketa9056さん
どうもありがとうございます。本文の該当箇所にご指摘に対応した追記をしました。
Lambada
Jul 11, 2015 18:28
'Thank
0 contribution
hiykashi0氏という方が多数のコメント(いずれも同様の内容)の投稿・削除を繰り返して
いるようで、立て続けに通知が来ています。明らかに当サイト(Qiita)の利用規約で禁止さ
れている「迷惑行為、嫌がらせ行為」に当たると思われます。
http://qiita.com/terms
第8条(禁止事項)
10%
2. ユーザーは、本サービスを利用するに際し、以下のような社会的に不適切な行為
を行ってはなりません。
(4)迷惑行為、嫌がらせ行為、
謗中傷行為、正当な権利なく他者に精神的被害・経
済的被害を与える行為
Qiita公式ブログに投稿された代表取締役社長の記事によれば、「関数型プログラミングに
目覚めた! IQ145の女子高校生の先輩から受けた特訓5日間」の著者である岡部健
(kenokabe)氏も、過去に同様の行為(および他の禁止行為)を行なってアカウントを取り
消されたそうです。
http://blog.qiita.com/post/109162836004/qiita
1. 一部ユーザーさまのユーザー資格の取消について
本件については当該のユーザーさまとご連絡のやりとりをさせていただいておりま
したが、事態の改善が見られない事象を*自他の投稿のコメント欄にて*複数回視認
したため、結果的に弊社サービス利用規約に基づきユーザー資格の取消という重い
判断をさせていただきました。
今回の一部のユーザーさまのユーザー資格の取消については、主にサービス利用規
約の以下に基づいた措置となります。
サービス利用規約:
第5条第1項第5号(ユーザー資格の取消)
第8条第1項第2号及び第3号(禁止事項)
第8条第2項第4号(禁止事項)
http://qiita.com/terms
第5条(ユーザー資格の取消)
1. 以下の事由が判明した場合には、当社の判断により、ユーザー資格を取消すこと
があります。
https://archive.is/r4i8e
16/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
(5)本規約に反する行為があった場合。
第8条(禁止事項)
1. ユーザーは、本サービスを利用するに際し、以下のような法律違反行為を行って
はなりません。
(2)プライバシーを侵害する行為
(3)名誉毀損行為、侮辱行為や他者の業務妨害となる行為
2. ユーザーは、本サービスを利用するに際し、以下のような社会的に不適切な行為
を行ってはなりません。
(4)迷惑行為、嫌がらせ行為、
謗中傷行為、正当な権利なく他者に精神的被害・経
済的被害を与える行為
しかし、nonstarter氏のおっしゃるとおり、今回はそのままにしておいたほうが、より多
くの方に状況がよくわかって良いかもしれません。
nonstarter
179 contribution
Jul 11, 2015 21:10
'Thank
hiyakashi_さん
私の方でもQiita運営に報告しておきました。
どういう対応を取られるかまではわかりませんが。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Lambada
0 contribution
Jul 15, 2015 10:27
'Thank
qiitapost氏(というアカウント名を名乗る一般ユーザの方)のコメントは、連投による迷
惑行為でアカウントを削除されたhiykashi0氏とまったく同じ内容ですね。
一方、3つの記事におけるnonstarter氏自身による同一コメントは、hiykashi0氏のスパム
コメントに関する注意喚起の記録として有用ですので、是非とも残しておいていただけれ
ば読者として幸いです。
私のこれまでのコメントもご参照ください。
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-7d7a978d53ad17b91
1c5
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-21b0c12e1828db8d9
fdc
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-e73245deb35efa5e2
dd9
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
17/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
Lambada
0 contribution
2015/11/05 0:41
Jul 15, 2015 12:47
'Thank
再確認ですが、本件の技術的事実関係は以下のとおりです。(長くなってしまったので読
みやすくするため、品のない強調をご容赦ください。)
1. 岡部氏が変数への破壊的代入かFRPが「必ず必要」と断じたGUIアプリケーションに対
し、私やnonstarter氏は、変数への破壊的代入もFRPも用いない実装が、原理的にも実
際にも可能であることを示しました。私の実装はTry OCamlで他の方も簡単に試すこと
ができます。
2. 岡部氏は私の実装が再帰により「メモリリーク」すると主張しましたが、私は(原理
的にも実際にも)メモリ使用量が一定以上に増えないことを示しました。これもTry
OCamlで容易に検証できます。
なお、nonstarter氏の3つの記事のそれぞれについて複数回ずつ同じコメントを再投稿した
hiykashi0氏や、hiykashi0氏のアカウント削除後に同じ内容のコメントを再投稿した
qiitapost氏(Qiita運営のようにも見えるアカウント名ですが一般ユーザの方です)と異な
り、nonstarter氏のコメントは各記事につき1回ずつだけ、かつ、ご自身の記事に対する迷
惑行為・嫌がらせ行為へのまっとうな対応であり、スパムには全く当たらないと思いま
す。
追記:qiitapost氏にコメントをいただいたのですが、もう人様の記事でさらにコメントの
数を増やすのも恐縮なので、ここに追記します。
「ブログ著者が先に示した実用的で複雑なGUIアプリケーションにもスケール可能なコ
ード」とのことですが、私の知る限り、岡部氏はそのようなコードを一度も示してい
ません。現に、岡部氏の言う「お絵かきロジック」すら、私やnonstarter氏は直ちに
具体的コードを示したにも関わらず、岡部氏自身は1か月以上も経っていまだに実装を
示していません。
「実用的で複雑な」という追加条件も、私が岡部氏の主張の明らかな反例となる具体
的プログラムを示してから1か月以上後になって、岡部氏が言い出したことです。
私のOCamlプログラムは、岡部氏の「破壊的代入かFRPを用いないと書けない」とい
う主張への具体的反例として示しただけで、他の方もおっしゃっているとおり、そも
そもOCamlでは破壊的代入を用いない実用的理由はありませんが、Haskellと同様に破
壊的代入を用いないGUIライブラリを作成することも可能です。
「FRPやそれと同格のHaskellのState なり IO を含む GUI モナド」とのことですが、岡
部氏は「FRPが必ず必要」と言っており、GUIモナドには一言も触れていませんし、そ
れらは全く「同格」でもありません。
「タイムラグがありすぎて実用に耐えない」の意味が不明ですが、(OCamlでなくて
も何らかの)プログラミング言語が少しでも理解できれば、マウスドラッグの始点と
終点を結ぶ線分を描くプログラムであることは明らかで、何ら「タイムラグ」はあり
ません。線分以外を描くプログラムにすることも容易です。
追記2:またqiitapost氏からコメントをいただきました。
Try OCamlで滑らかに動作する、線分以外(マウスドラッグをなぞる線)も描ける
「お絵かきロジック」(本来の意味は違うと思いますが…)は次の通りです。
mousedrag2.ml
open!Graphics
let!()!=!open_graph!"!900x600"
let!rec!k!=!function
!!|!`Up!:>
!!!!!!loop_at_exit![Button_down]!(fun!status!:>
https://archive.is/r4i8e
18/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
!!!!!!loop_at_exit![Button_down]!(fun!status!:>
!!!!!!!!moveto!status.mouse_x!status.mouse_y;
!!!!!!!!k!`Down)
!!|!`Down!:>
!!!!!!loop_at_exit![Button_up]!(fun!status!:>
!!!!!!!!k!`Up);
!!!!!!loop_at_exit![Mouse_motion]!(fun!status!:>
!!!!!!!!lineto!status.mouse_x!status.mouse_y;
!!!!!!!!k!`Down)
let!()!=!k!`Up
繰り返しになりますが、岡部氏の主張は以下のとおりでした。
http://kenokabe-techwriting.blogspot.jp/2015/05/esumiicamloebaocaml.html
関数型プログラミングのパラダイム内で、そういうマウスボタンが押されているの
か、押されていないのか?入力の状態が時間遷移していく場合、上記ブログエント
リでも論じたSICPでも、拙書でも解説しているとおり、FRPの実装が必ず必要とな
ります。
「時間」が本質的だから、時間をを集合、SICPの言葉でいえば「遅延ストリーム」
とした実装が必要です。
私やnonstarter氏のコードは、この岡部氏の主張に対する明らかな反例になっています。
「実用的で複雑な」という追加条件は、この時点では全く触れられておらず、完全に最近
の後付けです。
これも繰り返しになりますが、岡部氏は「実用的で複雑な」アプリケーションどころ
か、私やnonstarter氏が直ちに実装した「お絵かきロジック」すら、一か月以上も経っ
て示すことができていません。岡部氏のプログラムはFacebookのReactを正常な方法
では用いていないので、Reactのアプリケーションは岡部氏の主張する実用性の根拠に
は全くなりません。
追記3:三たび、qiitapost氏からコメントをいただきました。
上述のOCamlコードがどれぐらい滑らかに動作するか、Try OCamlにコピー&ペース
トしてEnterキーを押せばどなたでもご確認いただけます。
esumii氏やcamloeba氏が「実用的」なGUIアプリを書いたことがあるかどうかと、マ
ウスドラッグのような処理には破壊的代入かFRPが「必ず必要」という岡部氏の主張
とは全く別の問題ですので、両者を(意図的に?)混同して条件をすり替えることは
論理的に不適切です。前者はすでにTwitter上で実例をお答えになっていたと思います
し、後者は私やnonstarter氏が反例を示しました。
岡部氏の著書やコードは拝見しましたが、実用的なGUIアプリはありません。また、
ReactやFRP以前に岡部氏のJavaScriptコードは無意味に複雑・冗長で、失礼ながらま
さに「スパゲッティ」と言わざるを得ません。
追記4:qiitapost氏のコメントに追記がありました。
Try OCamlは(おそらくqiitapost氏が想像しているような)「エミュレータ」ではな
く、OCamlからJavaScriptへの「コンパイラ」です。
繰り返しになりますが、私のOCamlプログラムは岡部氏の主張への反例として示した
だけで、OCamlで破壊的代入を用いない実用的理由はありません。また、これも繰り
返しですが、nonstarter氏が示したような、FRP以外の実用的GUIライブラリを用いた
Haskellプログラムも、岡部氏の主張に対する反例になっています。
OCamlで書かれた実用的GUIプログラム(のごく一部)は、例えばLablGtkに依存する
OPAMパッケージだけでも右側(Necessary for)に数多く列挙されています。Haskellにつ
いては、これも一部だと思いますがGUIライブラリ一覧から多くのアプリケーションが
https://archive.is/r4i8e
19/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
いては、これも一部だと思いますがGUIライブラリ一覧から多くのアプリケーションが
たどれると思います。
Reactを「普通に」用いた、破壊的代入のない関数型クリックカウンターのJavaScript
ソースコードが こちらにありました(ソースコードなので当たり前ですが念のため、
ダウンロードしてブラウザで開けば誰でも簡単に実行できます)。FRPを自称しなが
ら破壊的代入を用いている岡部氏のコードと比較しても、どちらが洗練されているか
一目瞭然だと思います。また、実感としても、メソッドの呼び出し回数をカウントし
てみても、岡部氏のクリックカウンターは動作が重いようです。
岡部の自称FRPライブラリ「worldcomponent」がFacebook Reactを正しく使ってお
らずエラーを起こすことの確認方法という情報がありました。「仮にforceUpdateのエ
ラーが起きなかったとすると4と5を繰り返すだけでメモリリークが起きるはず」「そ
もそも関数型であるはずのユーザ側が、もろに命令的な再描画呼び出しを自分で登録
しなきゃいけないって、FRP以前にGUIライブラリとしてどうなのよ…」(強調筆者)
とのことです。
これ以上はnonstarter氏や他の読者の皆様にもご迷惑をかけてしまいますし、ここまでの
議論をお読みいただければ(さらに実際のプログラムもご覧になっていただければ)ほと
んどの方には十分にご理解いただけると思いますので、特に新たな情報や必要がない限り
差し控えたいと思います。長々と失礼しました>nonstarter様、皆様
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
nonstarter
Jul 15, 2015 19:07
'Thank
179 contribution
nonstarter氏は人に言われてから、FRP以外の実用的GUIライブラリを持ちだしたわ
けですが、IOモナドっていうのも、イベントストリームとしてFRPを書くのとさほ
ど変わらないわけで、根本は同じです。
qiitapostさんは言ってることが支離滅裂なので別にお相手をする必要もないと思うのです
が(私としては意味不明な特徴的長文をせいぜい薄目を開けてニヤニヤしながら眺めるに
過ぎませんが)、たまたま目についたので少しだけ。まず、「人に言われてから」という
のがどういうことなのかが
ですし(誰かに言われてHaskellコードを追記したわけでな
しGlossライブラリを使えと誰かに言われた覚えもなし)、そもそもIOモナドがFRPと
「さほど変わらない」ような世界に私を含めた普通の人間は住んでいないので、そこのと
ころどうぞよろしくお願いします 1。
なお、qiitapostさんのコメント投稿から読者には実に「色々なこと」がわかると思います
が、少なくとも特異な人物認定とそれに基づく無根拠な 謗の類はお避けになったほうが
よろしいでしょう。
https://archive.is/r4i8e
20/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
よろしいでしょう。
なお、ついでですので、kenokabeさんが変数の破壊的更新をしないFRPで(あろうこと
か)未だに実装できていない「クリックカウンター」と、(これまたあろうことか)そも
そもコードすら書かれていない「お絵かきロジック」を、qiitapostさんがkenokabeさんに
代わって(もちろん変数の破壊的更新を伴わない純粋にFRPなJavaScriptコードで)実装
されると一連のご主張に説得力が多少は増すかと思いますのでとてもお勧めです。
1. IOモナドで書くだけでイベントストリームによるFRPと変わらないというお説に従えば、Haskellで
書きさえすれば入出力はIOモナドによるしかないので、どうあがいてもFRPになるわけです。なる
ほど実に結構なお話で、わざわざ苦労しないとFRPできない(そしてまさにお蔭でkenokabeさんに
はできなかった)JavaScriptでのFRPなんか仰々しく広める暇があったら、qiitapostさんにおかれ
ましてはHaskellを布教されるのがよろしいのではないでしょうか(GHCJSを使えばJSコードにコ
ンパイルできますのでご不満もないでしょうし)。
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 17, 2015 21:27
'Thank
qiitapostさん
私がニヤニヤ笑っているのはqiitapostさんに対してであってkenokabeさんに対してではな
いのですよ。無理からぬことでしょう。kenokabeさんの独特な見解と独特な文体をここ
まで高度に模倣された投稿をされたら誰だってニヤニヤしてしまいますよね。対象の特徴
を実に的確に捉えた高度なモノマネ芸を見せられて笑わない人はいないでしょう? 読者
の多くも同じであると思います。
kenokabeさんのものであれqiitapostさんのものであれ「独特な見解」の中身については別
にニヤニヤはしませんよ。薄目が足りずにうっかり中身を読んでしまったりしたときに呆
れはしますが。ある記事のコメント欄で行われているqiitapostさんのモノマネ芸をニヤニ
ヤしながら眺めるとなぜそれが、本体記事がkenokabeさんの著作に対する 謗中傷であ
るとか「批判のための批判」であるとかいうことになるのか、およそ私の理解の及ばない
ことですのでその点どうぞよろしくお願いします。
@nonstarterさんは言ってることが支離滅裂なので別にお相手をする必要もないと思
うのですが(私としては意味不明な特徴的長文をせいぜい薄目を開けてニヤニヤし
ながら眺めるに過ぎませんが、という感じでこの長大な、批判のための批判記事を
読んでおれば良いと思います。
# それにしてもこのオウム返しはちょっと芸がないですね。独創性に れたkenokabe
さんならきっとこうするだろう、というところをもう少し真似して見せてくださるとよろ
しいのではないでしょうか。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
21/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 17, 2015 21:55
'Thank
なるほど、コメントに即座に反応する辺りとか、話の筋道がナチュラルにズレていく辺り
とか、kenokabeさんがかつてQiitaでご活躍だったときのことを彷彿とさせる大変素晴ら
しいモノマネ芸です。楽しませていただきました。
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 17, 2015 22:29
'Thank
qiitapostさん
そもそもFRPライブラリのコードはFRPをしているわけではないので(実装が関数型であ
ることを標榜もしていないでしょう)破壊的更新を用いても別に差し支えないですよ(も
ちろんライブラリも関数型で簡潔に書けるならライブラリのメンテナンスがしやすそうで
はありますけれども)。せっかく破壊的更新を使わずに済むためのFRPを可能にするライ
ブラリがあるのに、わざわざ破壊的更新を行ってFRPライブラリの意義を無にするような
コードを書けばそれは関数プログラミングでもなんでもないよね、というだけのことで
す。あるFRPライブラリを使いながら、どうしても破壊的更新を使わないと「実用的な」
コードが書けない――たとえば当該のFRPライブラリに足して変数の破壊的更新を使用し
た自作の「ライブラリ」とやらで補完しないといけない――というのなら、そのFRPライ
ブラリがFRPライブラリとしての目的を達成しておらず関数プログラミングに適したイン
ターフェイスを用意していない不完全なものだということになるだけです。
実際には同じものが遥かに簡潔にかつ変数の破壊的更新を行うことなく書けることが示さ
れているわけですから、これはReactのせいではなくkenokabeさんのコーディングの問題
に過ぎません。それにしても非関数型かつスパゲティな、拡張もメンテナンスもしにくそ
うな自作「ライブラリ」なので、総体としてまったく関数プログラミングの恩恵が得られ
ていない辺りはお気の毒です。下記のものはどなたかが作成されたリファレンスですが、
なかなか楽しいものですね:
https://gist.github.com/anonymous/9d13ea4695c27210fd32
そもそもFacebook-Reactアプリケーションの体すら為していないという指摘について
は:
https://gist.github.com/anonymous/1944f34703bcb63131d8
# なお、お返事のコメントが即時だったものでうっかり読んでしまいましたが、これで
薄目に戻りますのでお返事はされてもされなくてもどうぞご自由に。
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
https://archive.is/r4i8e
Jul 17, 2015 23:05
'Thank
22/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
179 contribution
'Thank
イキイキとされていて大変に結構なことです。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
OmankBSD
Jul 18, 2015 11:55
'Thank
0 contribution
とりあえず、みなさん落ち着きませんか。ここが、nonstarterさんのエントリのコメント
欄であることを考えて行動する事が賢明だと思います。
あと、qiitapostさんはこれまで見かけなかった貴重なkenokabeさんの同調者のようですの
で、なるべく紳士的に対応すれば、kenokabeさんがダンマリを貫いている「メモリリー
クが起こっている」件についての検証のプロセスや、StackOverflowにおける「reduceか
らmapを合成するにはどうしたら良いか?」という趣旨の不可思議な質問の真意について
も、代弁してくれるかもしれません。
さらにはAmazonで
のレビューをされていた、coolio氏の事についても真相もご存じか
もしれません。
kenokabeさんには「同調・声援のメール」が多数届いているようですが、国内外のサイ
トを見渡しても同調的なエントリはゼロだったので不思議に思っていたところです。ここ
へきてようやくqiitapostさんのような方が現れたのですから、耳を傾けたいところです。
カリフォルニア大学ロサンゼルス校でコンピュータサイエンスを専攻して卒業された
kenokabeさんを通して、UCLA、ひいてはアメリカの情報技術の常道を垣間見ることもで
きるかもしれません。
また、kenokabeさんは現在、ご本人の弁によると弁護士から虚偽告訴をされているとの
ことで、ご多忙のようですので、あまり手間をとらせるのは忍びないです。
ですので、同調者であるqiitapostさんとの議論は、必要に応じて、エントリを新たにして
議論するなど、した方がより多くのユーザーの利になるかと思います。
https://archive.is/r4i8e
23/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
OmankBSD
0 contribution
2015/11/05 0:41
Jul 18, 2015 12:00
'Thank
kenokabeさんやqiitapostさんを招いて、公開議論をするというのも良いでしょうね。ニコ
ニコ生放送等で、企画して頂ける方いらっしゃいませんか
kenokabeさんは「教育者」としてのプロフィールもお持ちのようですので、応諾して頂
けるはずです
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 18, 2015 12:12
'Thank
ですので、同調者であるqiitapostさんとの議論は、必要に応じて、エントリを新た
にして議論するなど、した方がより多くのユーザーの利になるかと思います。
BeastTadokoroさんかqiitapostさんが自分のQiitaアカウントで好きなだけ記事をお書きに
なって、そのコメント欄で議論されればよろしいことです。私の方では薄目が足りずにう
っかり中身を読んでしまったので幾つかに反応しただけのことで、kenokabeさんの特徴
をよく捉えた秀逸な芸当として笑う以外にqiitapostさんのコメントに興味はありません。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Jul 18, 2015 13:24
'Thank
qiitapostさん、落ち着いて、深呼吸して発言にのぞんではいかがでしょうか。
教育者であられるkenokabeさんも、そのようなものの言い方は、顔をしかめられるので
はないでしょうか。
無論、みなさん紳士的に議論するべきです。
たとえば、kenokabeさんの「メモリリークが起こっている」件についての検証のプロセ
スや、StackOverflowにおける「reduceからmapを合成するにはどうしたら良いか?」と
いう趣旨の発言については、同調者としてはどのようにお考えでしょうか?
いろいろ、興味が尽きません。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Jul 18, 2015 14:09
'Thank
喧嘩はやめましょうよ。
https://archive.is/r4i8e
24/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
私もとある有名な企業で働いているIT系エンジニア(納税者)ですが、感情に訴えるよう
ではいけません。
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Jul 18, 2015 14:22
'Thank
qiitapostさん、「中傷コンテストから」とか、そういう言い方、あなたも良くないです
よ。
ハンドルやIDにまでいちゃもん付けるのは、どうなのでしょうか?その言いぐさならば、
qiitapostという名前は、いかがなものでしょうか、という話になってきますよ。
あなただけがネガティブとは言いませんが、あなたこそが一番、中傷的だと私は思いま
す。落ち着いてください。
Q_Jirou
0 contribution
Jul 18, 2015 17:07
'Thank
私もqiitapostさんの感情的なものの言い方は感心しませんね。
なぜそこまで岡部氏でも無い別の人がむきになっているのかはわかりませんが、ハンドル
にまで因縁をつける態度は常軌を逸しています。ここがどこかをよく考えて行動すべき。
それに、そんなに異議があるならご自分でコードを書いてみては。
100の罵倒より100ステップのコードを心掛けて。
UCLAをご卒業されているとされる岡部さんも、あなたの主張にはご興味がおありのはず
です。
Q_Jirou
0 contribution
Jul 18, 2015 17:25
'Thank
お、公開討論は良いアイディアですね。qiitapostさん、いかがでしょうか?
席を用意すれば、ご参加頂けますか?無論、フェアな席を考えます。
niceguyhatanano
0 contribution
Jul 19, 2015 01:22
'Thank
@Q_Jirou @BeastTadokoro 業務連絡 提督より指示待ち とりあえず落ち着くように
nonstarter
179 contribution
Jul 19, 2015 08:55
'Thank
@niceguyhatanano さん
そういうことはご自分でレビュー記事を書かれるなりして他所でなさってくださいます
か。
niceguyhatanano
0 contribution
Jul 19, 2015 16:17
'Thank
コメント欄が仲間に荒らされているので助け舟を出したつもりですが?
@nonstarterさんだって仲間じゃないですか。
https://archive.is/r4i8e
25/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
@nonstarterさんだって仲間じゃないですか。
スレで提供されたネタだけ何度も使っておいてそりゃないでしょ。
でもご迷惑のよなので私はこれにて失礼します。
では、また例のスレで。
Q_Jirou
0 contribution
Jul 19, 2015 19:32
'Thank
@niceguyhatanano あなた誰ですか。よくわかりませんが、荒らし目的なら迷惑です。や
めてください
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 19, 2015 20:50
'Thank
@chimetorch 私は岡部氏をコケにしたことはないし、2ちゃんねるを見たことはここ数年
無いですし、変な言いがかりはおやめください。迷惑です。
そもそもBEASTTADOKOROさんのコメントもなんら問題なさそうですが。他のユーザー
を注意までしてるようですし。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 19, 2015 20:59
'Thank
@chimetorch スレッドというのは2ちゃんねるの、という意味ですか?
繰り返しますが、私は知りませんし、私に言われても困ります。
私はQ次郎と名乗ったことも、ありません。
妙な言いがかりは、おやめください。
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Jul 19, 2015 21:26
'Thank
私も無関係です。
トピ主であるnonstarterさんともQ_Jirouさんとも面識も交流もございません。
率直に申し上げるなら、私のIDを出される以上は、妙な怪文は御免こうむりたいもので
す。迷惑です。以上
The user qualification of the comment's author is cancelled.
Lambada
0 contribution
https://archive.is/r4i8e
Jul 20, 2015 00:16
'Thank
26/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
岡部氏の本やブログに対する技術的な誤りの指摘と、2チャンネル云々とは別の問題です
ので、前者は技術的事実のみに基づいて議論されるべきだと思います。(後者について
は、私も無関係で、迷惑ですので他所でやってほしいと思います。)
その前者について、これまでに明らかになった岡部氏の技術的な誤りがあまりにも多いた
め、すべて網羅することはできませんが、私が直に関わった部分は以下のとおりです。
岡部氏は、いわゆる「お絵かきロジック」(本来の意味は違います)のようなGUIアプ
リには破壊的代入か、岡部氏の主張するようなFRPが「必ず必要」と断言しました
が、私やnonstarter氏は破壊的代入もFRPも用いない「お絵かきロジック」の実装を示
しました。
それに対し岡部氏は、私やnonstarter氏の実装は再帰を使っているので「メモリリー
ク」すると主張しましたが、そのような事実はないことが示されました。
岡部氏は、私やnonstarter氏の実装が「実用的で複雑な」GUIアプリではないと主張し
ました。しかし岡部氏は著書でもインターネット上でも「実用的で複雑な」GUIアプ
リどころか、関数型の「クリックカウンター」や、関数型どころか命令型の「お絵か
きロジック」すら示していません。
加えて、岡部氏がFRPライブラリと主張する「worldcomponent」と、それを用いた「ク
リックカウンター」を、私も改めて精査してみました。
まず、クリックカウンターのソースコード中に
___.world!=!...;
という形の代入文が何度か現れています。これはworldcomponentのworldプロパティのセ
ッター定義
Object.defineProperties(worldcomponent,
{
!!world:!//our#physical#world
!!{
!!!!set:!function(f)
!!!!{
!!!!!!return!f();
!!!!}
!!}
});
から、 ... の部分にあたる関数の呼び出しと等価です。引数が何も与えられておらず、戻
り値も使われていないことから、この関数呼び出しは副作用しか意味を持たないことがわ
かります。
そのように呼び出される ... の部分にあたる関数は、worldcomponentの compute メ
ソッドおよび appear メソッドが返すもので、前者は(値が更新されたときの)コール
バックの登録、後者は値の破壊的更新を行ないます。(なお、すでに指摘されている
とおり、 compute で登録したコールバックを解除する方法がないため、動的に現れた
り消えたりするUIに必須のunmount処理を行なうことができず、エラーやメモリリー
クを引き起こします。)
worldcomponentのもう一つのメソッド now は、上述のように破壊的に更新された、現
在の値を返します。
岡部氏のクリックカウンターは、worldcomponentのこれらのメソッドを用いて
!!!!___.world!=!com.props.___clicks
https://archive.is/r4i8e
27/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
!!!!!!!!!!!!!!!!!!.appear(com.props.___clicks.now()!+!1);
!!!!___.world!=!___totalClicks
!!!!!!!!!!!!!!!!!!.appear(___totalClicks.now()!+!1);
のように、 state = state + 1; と等価な破壊的更新を行なっています。( appear によ
り破壊的に更新された値は次の now により取得されるため、worldcomponentの副作用は
まったく隠
されていないどころか、クリックカウンターの本質的部分で積極的に利用さ
れています。)
以上のことから、岡部氏のworldcomponentおよびそれを用いたクリックカウンターは
FRPでも関数型でもなく、複雑な形で書かれた命令型そのものであることがわかります。
ご参考になれば幸いです。
The user qualification of the comment's author is cancelled.
Lambada
0 contribution
Jul 20, 2015 10:28
'Thank
私がだれかと秘密裏に連絡をとって岡部氏を中傷している、といった妄想は迷惑であると
いうことです。私の文章やコードは私が自分で考えて書いたものですし、他の方のコード
もすべてインターネット上で広く一般に公開されているものです。
chimetorchさんのおっしゃるようなコードは、worldcomponentを使っていようが(表面
的に)Reactを使っていようが、FRPでも何でもない、命令型プログラムです。ご参照さ
れているFacebookのコードも、まさに「A Stateful Component」(状態のあるコンポー
ネント)という題名がついています。そもそも(岡部氏ではなく)FacebookはReactを
「関数型(functional)の」reactive programmingライブラリと言っているのでしょう
か?? お示しになったページはまさに「state」(状態)に関する説明で、
「functional」(関数型)という単語も見当たりませんが…
追伸:下のほうのコメントでご引用の「There is nothing React specific about using
Immutable data in React」は、和訳すると、まさに「Reactでイミュータブルなデータを
使うことに関して、Reactに特別な点は何もありません」という文ですが…
FRPについては、ちょっと検索すれば https://wiki.haskell.org/Functional_Reactive_Progra
mming 等の基本的解説がすぐに見つかります。まっとうなFRPで書かれたクリックカウン
ターは、例えば http://elm-lang.org/examples/mouse-clicks にありますね(「真のFRPの
コードを我々に提示して見せてください」「貴方には絶対できない」と断言されました
が、こうして現に示しましたよ)。岡部氏の命令型コードとは似ても似つかぬ、本当に
「時間にしたがって変化するイベントのストリーム 1」です。
import!Graphics.Element!exposing!(..)
import!Mouse
main!:!Signal!Element
main!=!Signal.map!show!countClick
countClick!:!Signal!Int
countClick!=!Signal.foldp!(\clk!count!:>!count!+!1)!0!Mouse.clicks
他のお尋ねにもきちんとお答えできるとは思いますが(混同なさっている変数への破壊的
代入と状態の破壊的更新の区別や、「等価」という技術用語の意味、副作用のみに依存し
https://archive.is/r4i8e
28/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
た岡部氏のプログラミングスタイル、コンポーネント全体がimmutableなどなたかの関数
型クリックカウンターと岡部氏の命令型クリックカウンターの違い等)、多数のコメント
の連投など、qiitapost氏とchimetorch氏(同じ方かもしれませんが)の言動が尋常でな
く、論理的コミュニケーションが不可能ですので、すみませんが私が必要を認めない限り
お断りします。図らずも、私が最初に述べた「本書の数々の重大な誤りに対し正当な技術
的批判を加えても著者から激しい
謗中傷行為を受ける」ことの強い傍証になったかと思
います。
1. FRP (functional reactive programming)のまさに基本中の基本ですが、qiitapost・chimetorch・岡部
氏は根本的に誤解なさっているようですので念のため、時刻tにしたがって変化する値f(t)に対する無
限に長いリスト[f(0),f(1),f(2),f(3),...]のことです。関数的(functional)ですので、このリスト自体(各要
素の値や並び)は決して変化しません。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 20, 2015 22:18
'Thank
ソックパペットを駆使する芸風までをも見事に模写しきった秀逸なモノマネをどうもあり
がとうございます。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
https://archive.is/r4i8e
Jul 21, 2015 08:12
'Thank
29/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
つまり、一般論としてのFRPではなく「Lambada氏には絶対に出来ない」という主語が異
なる限定的な断定なのですね。
ご理解されたようで、良かった。
The user qualification of the comment's author is cancelled.
Lambada
Jul 21, 2015 08:25
'Thank
0 contribution
@Q_Jirou さん、
私は chimetorch 氏に「真のFRPのコードを我々に提示して見せてください」と要求され
たので、chimetorch 氏が要求したとおり、「真のFRPのコード」を提示しました。
また、「https://gist.github.com/anonymous/1daf8c806939e7614c00 がFRPである」とは
私を含め誰も主張していません。私の追伸にも書いたとおり、(岡部氏のクリックカウン
ターと違って)コンポーネント全体がimmutableであるから、書いた方も「関数型」と言
っているのだと推測します。これもすでに述べたとおり、qiitapost氏とchimetorch氏は
「変数への破壊的代入」と「状態の破壊的更新」、「関数型プログラミング(Functional
Programming)」と「FRP (Functional Reactive Programming)」と(単なる)「Reactive
Programming」を(意図的に?)混同して「矛盾」とか「方針転換」とかおっしゃってい
るようですが。
追伸の最初の部分にもご注意ください。
下のほうのコメントでご引用の「There is nothing React specific about using
Immutable data in React」は、和訳すると、まさに「Reactでイミュータブルなデー
タを使うことに関して、Reactに特別な点は何もありません」という文ですが…
P.S. うっかり
私は chimetorch 氏に「真のFRPのコードを我々に提示して見せてください」と要求
されたので、chimetorch 氏が要求したとおり、「真のFRPのコード」を提示しまし
た。
と書いてしまいましたが、「真のFRPのコードを我々に提示して見せてください」と要求
した方はchimetorch氏ではなくqiitapost氏でしたね(下のコメントではなぜか
chimetorch氏が全く否定もせずqiitapost氏のかわりに回答していますが)。chimetorch
氏とqiitapost氏(と岡部氏)の主張や言動があまりにもソックリなので、つい間違えてし
まいました。失礼しました。
どなたかの関数型クリックカウンター1と、岡部氏のクリックカウンターの違いについて
は、すでに述べたとおり2です。私がElmコードを示した理由は、単にJavaScriptよりも
FRPに適しているからです 3。qiitapost氏やchimetorch氏も岡部氏とまったく同様に、他人
には様々な説明や実装を要求しつつ、ご自分では関数型のクリックカウンターや(命令
型・関数型を問わず)「お絵かきロジック」すら示そうとしない4上、いくら論理的にご
説明しても激しい
https://archive.is/r4i8e
謗中傷が返ってくるだけでした 5(岡部氏やqiitapost氏やchimetorch
30/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
説明しても激しい
2015/11/05 0:41
謗中傷が返ってくるだけでした 5(岡部氏やqiitapost氏やchimetorch
氏は、岡部氏に対する技術的批判はすべて「
謗中傷」だとおっしゃっていますが)。残
念です。
P.S. ついでの追記で恐縮ですが、何度も繰り返し述べているとおり、 state = state +
1; のような「変数への破壊的代入」あるいはworldcomponentのappearのような「変数の
値の破壊的更新」と、 o = { state: o.state + 1 }; のような「参照の破壊的更新」あ
るいはReactのsetStateのような「状態(状態オブジェクトではありません)の破壊的更
新」は全く異なります(前者は状態オブジェクト自体をmutateしていますが、後者は違い
ますので、過去の状態への巻き戻しや状態オブジェクトの再利用等が容易なだけでなく、
部品の独立性が高まります)。それもいくらご説明してもご理解いただけないようですの
で(またJavaScript以外の言語はご自身が要求された「真のFRP」に適したElmであって
もご理解いただけないようですので)、残念ながら(関数型だけでなく命令型も)プログ
ラミングに関する技術的議論はできません。
1. 誰もFRPとは言っていません(Reactがreactive programmingライブラリで、それを関数型コードか
ら利用しているから自動的にFRPになる、などという理屈も当然ながら成り立ちません)
2. 岡部氏のworldcomponentの appear は状態オブジェクトの中の変数への破壊的代入(すなわち値
の破壊的更新)を行なっているのに対し、Reactの setState は状態オブジェクトへの参照の破壊
的更新を行なっているだけで、状態オブジェクト自体はimmutableです(前者は state = state +
1; 等と等価ですが、後者は違います)
3. かなり最初のほうのコメントでも既出ですが、Elmは代表的なFRP言語です。Elmで「真のFRP」を
示されて違和感を覚えたということは、FRPのことをよくご存じではないのでしょう。
4. 「JavaScript(とReact)でFRP」は私ではなく岡部氏の主張です。私は岡部氏の主張するFRP
(Functional Reactive Programming)が何ら関数型(Functional)ではなく、むしろ逆にまさしく命令型
であることを指摘したまでです。それに対してqiitapost氏とchimetorch氏が「真のFRPを示せ」と
いうので、JavaScriptよりもFRPに適しているElmで示したところ、今度はなぜか岡部氏ではなく私
に「JavaScriptで真のFRPを示せ」と要求しています。「論理的」どころか、完全に支離滅裂で
20%
す。
5. これまでのすべてのご質問や要求に明確にご回答したと思いますが全くご理解いただけず、完全に
どなたかの予想どおりになりました。本当に残念です。(ご迷惑がかかるといけないので当たり前
ですが念のため、私とは別人です。まさに「特異な人物認定」ですね…というか、その方は岡部氏
も「良識がある」と評価したコメントですでにほとんど名乗っておられますが、わからないのでし
ょうか…)
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 21, 2015 08:39
'Thank
ありがとうございます。主語含め、よく、わかりました。
なるほどなるほど。きっちり、真のFRPコードが可能なことが確認できました。
決着ですね。
それにしても、熟読って大事ですね(自戒をこめて)
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
31/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 21, 2015 11:37
'Thank
【「真のFRPのコードを我々に提示して見せてください」と要求した方はchimetorch氏で
はなくqiitapost氏でしたね(下のコメントではなぜかchimetorch氏が全く否定もせず
qiitapost氏のかわりに回答していますが)】
この事も含めて、私は自作自演だと思います。
発言は自由ですが、複数のアカウントを用いてあたかも複数人で対話しているかのように
装うのは、議論の混乱をもたらすので、荒らし行為に準じます。速
やかに慎むべきです。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 21, 2015 17:32
'Thank
Day4、やはり望みは薄いと考えた方がよいでしょうか?
個人的に、楽しみです。勉強になりますので
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Lambada
0 contribution
Jul 24, 2015 10:59
'Thank
qiitapost氏とchimetorch氏によるコメントが極端に多く、追記にも限界がありますので、
またコメントを増やしてしまいnonstarter氏や他の皆様には本当に恐縮ですが、改めてま
とめておきたいと思います。時間の都合上、(主旨が変わらない範囲で)後から加筆・修
正を行なう可能性もありますがご容赦ください。
岡部氏のworldcomponentを用いたクリックカウンターにおいて実際にカウンターを
増やしているコード
!!!!___.world!=!com.props.___clicks
!!!!!!!!!!!!!!!!!!.appear(com.props.___clicks.now()!+!1);
!!!!___.world!=!___totalClicks
!!!!!!!!!!!!!!!!!!.appear(___totalClicks.now()!+!1);
https://archive.is/r4i8e
32/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
は、極端に複雑化されていますが読み解くと、例えば後者は ___totalClicks が指す
worldcomponent内の変数 state に対する破壊的代入 state = state + 1; と等価です。
つまり、状態オブジェクトの 中の値が破壊的に更新されています。前者についても同様で
す。したがって、この岡部氏のコードはworldcomponentの内部実装だけでなく、それを
利用しているクリックカウンターも 自身の状態オブジェクトの中身を変更(mutate)してい
るので関数的(functional)ではありません。
一方、https://gist.github.com/anonymous/1daf8c806939e7614c00 においてカウンタ
ーの値を増やしている部分
!!!!!!!!!!!!const!newData!=!this.state.data.map(function(v,!i)!{return!v!+!((number!=
==!i)!?!1!:!0)});
!!!!!!!!!!!!const!newTotal!=!this.state.total!+!1;
!!!!!!!!!!!!this.setState({data:!newData,!total:!newTotal});
は、既存の状態オブジェクトの中身は変更せず (いわゆるimmutable)、新しい状態オブ
ジェクトを作り、Reactが持っている参照をReactの setState により更新しているだけ
です。したがって、Reactは(少なくとも setState については)関数的(functional)とは言
えませんが(岡部氏ではなくFacebook社が本当にそう主張しているのかどうかも疑問で
すが)、Reactの setState を除けば https://gist.github.com/anonymous/1daf8c806939e7
614c00 自体は関数的(functional)です。
timecomponentについては私は精査していませんが、誠に失礼ながらworldcomponentに
関する岡部氏(および岡部氏とソックりな言動を行なう方々)の主張がデタラメであった
ことを考えると、推して知るべしと愚考します。
(あまりにもコメントが多すぎて、もはや誰も読んでいないかもしれませんが)皆様のご
参考になれば幸いです。
追記: 重ね重ね失礼ながら、下のコメントを拝見すると、やはりchimetorch氏とqiitapost
氏(書籍やブログの主張を見る限り岡部氏も)は、参照と値の区別ができていないようで
す(確かに命令型プログラミングの初心者が最初につまづく部分ではありますが…)。
worldcomponentによる値の更新は
var!o!=!{!state:!42!};
var!o2!=!o;
o2.state!=!o2.state!+!1;
と同様で、適当なJavaScriptコンソールで試せばすぐにわかりますが、 o2.state だけで
なく既存の o.state の値も変化してしまいます。一方、「関数型クリックカウンター」に
よるReactの setState の使い方は
var!o!=!{!state:!42!};
var!o2!=!o;
o2!=!{!state:!o.state!+!1!};
と同様で、既存の o.state の値は変化しません。実際のJavaScriptコードを理解できる方
ならば、上述の「同様」や、前述の「つまり」「したがって」等は(worldcomponentの
コードが極端に複雑で、忍耐をもって読み解かなければいけないことを除けば)自明です
ので、それをご理解いただけないのであれば、やはりプログラミングに関する技術的議論
は不可能であると言わざるを得ません。
https://archive.is/r4i8e
33/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
追記2: worldcomponentは(ReactのsetStateと異なり)内部実装の問題ではなくユーザ
から見える状態オブジェクトの中身を破壊的に更新してしまうことを、chimetorch・
qiitapost両氏にはどうしてもご理解いただけないようですので、皆様のご参考までに、再
び具体的コードでお示しします。ChromeのJavaScriptコンソール等で、worldcomponent
のソースコードをコピー&ペースト等で読み込んだ後、以下のコードを実行します。
var!___!=!worldcomponent;
var!___totalClicks!=!___(0);
___.world!=!___totalClicks.appear(42);!//#___totalClicksの値を42に設定
var!___totalClicksBak!=!___totalClicks;!//#___totalClicksの「バックアップ」を保存
___.world!=!___.log('___totalClicks!=!'!+!___totalClicks.now());!//#___totalClicksの現
在の値を表示
___.world!=!___.log('___totalClicksBak!=!'!+!___totalClicksBak.now());!//#___totalCli
cksBakの現在の値を表示
___.world!=!___totalClicks.appear(___totalClicks.now()!+!1);!//#___totalClicksの値を更
新
___.world!=!___.log('___totalClicks!=!'!+!___totalClicks.now());!//#当然ながら___total
Clicksの値は増えている
___.world!=!___.log('___totalClicksBak!=!'!+!___totalClicksBak.now());!//#「バックアッ
プ」の値は…???
すると、出力は以下のようになります。
___totalClicks!=!42
___totalClicksBak!=!42
___totalClicks!=!43
___totalClicksBak!=!43
このように、 ___totalClicks のほうしか更新していないのに、 ___totalClicksBak の
値まで変わっています。(岡部氏のものではない)関数型クリックカウンターでは、状態
オブジェクトはimmutableですので、このようなことは起こりません。
また、これも再三の繰り返しになりますが、React(の setState )は関数的ではありま
せんが、https://gist.github.com/anonymous/1daf8c806939e7614c00 自体は関数的コード
です。特に(岡部氏のworldcomponentを利用したクリックカウンターと異なり)状態オ
ブジェクトはimmutableです。chimetorch・qiitapost氏は(意図的に?)私の文章を(ま
ったく内容の異なる)独自の解釈で置き換えていますが、私の説明は当初から現在に至る
まで、まったく変わっていません。
(chimetorch様: まさにReactの setState 自体は関数的ではない(が https://gist.github.
com/anonymous/1daf8c806939e7614c00 のような、それ自体は関数的なコードから利用
できる)という、私が何度も申し上げていることをようやくご理解いただけたようで幸い
です。一方、岡部氏のworldcomponentは、状態オブジェクトの中身を破壊的に更新して
しまうので、関数的に利用することができません。すべてこれまでに私がご説明してきた
とおりです。ようやくおわかりいただけたほうで幸いです。)
(ふたたびchimetorch様: 最初に述べたとおり主旨は変わりませんが文章の編集と前後
して失礼しました。JavaScriptの仕様から、 this.setState({secondsElapsed:
this.state.secondsElapsed + 1}); は、「secondsElapsedが指すReact内の変数
state」とおっしゃる部分の意味が不明ですがそれを別にすると、いかなる変数stateに対
してもおっしゃるような 「破壊的代入state = state + 1;と等価」ではありませんし、「状
態オブジェクトの中の値が破壊的に更新されて」もいません ので、お話の前提が正しくあ
りません。やはり参照と値の区別を含め、JavaScriptの仕様をご理解されていないように
思います。以上です。)
https://archive.is/r4i8e
34/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
(三たびchimetorch様: 参照のコピーで「バックアップ」がとれないということは、ま
さにそのライブラリが内部実装だけでなく外部仕様として、関数的ではないことの証左 で
す。言うまでもありませんが、JavaScriptでも関数的あるいはイミュータブルなオブジェ
クトであれば、一般的に参照のコピーで「バックアップ」が可能です。 Immutabilityを利
用した、参照のコピーによる「バックアップ」は、関数型プログラミングの基本中の基本
ですので、ご理解されていないとしたら非常に残念です。例えば先の関数型クリックカウ
ンターの
!!!!!!!!!!!!this.setState({data:!newData,!total:!newTotal});
を
!!!!!!!!!!!!backup!=!this.state;!//#参照のコピーにより「バックアップ」をとる
!!!!!!!!!!!!this.setState({data:!newData,!total:!newTotal});!//#状態の更新
!!!!!!!!!!!!this.setState(backup);!//#「バックアップ」を用いて状態を巻き戻す
とするだけで、現にカウンターの値が増えなくなり、参照のコピーにより状態の「バック
アップ」と巻き戻しが実現できていることが容易にわかります。同様に参照のコピーを用
いて、ユーザが好きなときに好きなだけ状態を巻き戻せる例も、かなり前からこちらにあ
りました。一方、岡部氏のworldcomponentを用いたクリックカウンターは、このように
参照のコピーを用いて状態の「バックアップ」や巻き戻しを行なうことはできませんの
で、取りも直さず関数的ではないということになります。)
P.S. またうっかりqiitapost様のコメントへのご返信を「chimetorch様」宛に書いてしまっ
たところ、また特にご指摘もなくchimetorch様からご返信をいただきました。重ね重ね失
礼しました。
(四たびchimetorch様: 私は一度もReactのsetState自体がimmutableであるとは言って
いません。というか「メソッド(setState)がimmutable」という用語の意味が不明です。私
はsetStateにimmutableなオブジェクトを渡すことにより、関数的なコードからReactを利
用できる、と繰り返し言っています。すみませんが岡部氏もchimetorch様もqiitapost様
も、私や他の方の発言や文書を曲解されることがあまりにも多く、およそ論理的な議論が
できないように思われます。さらに依然として 他人にばかり説明やコードを要求し、ご自
分は関数型クリックカウンターや、関数型あるいは命令型の「お絵かきロジック」すら示
そうとされません。私がそのような議論や要求に応える義務があるとは思いません。)
(五たびchimetorch様: お示しいただいた
state.totalClicks!=!state.totalClicks!+!1;
という更新によるご説明は、岡部氏のクリックカウンターのようにworldcomponentを状
態オブジェクトとして用いた場合や、 今までの話の中では誰もしていませんが Reactの
stateが参照するオブジェクトの 中身を破壊的に更新した場合にしか当てはまりません。先
の関数型クリックカウンターの更新
!!!!!!!!!!!!const!newData!=!this.state.data.map(function(v,!i)!{return!v!+!((number!=
==!i)!?!1!:!0)});
!!!!!!!!!!!!const!newTotal!=!this.state.total!+!1;
!!!!!!!!!!!!this.setState({data:!newData,!total:!newTotal});
や、Facebook社のサンプルにあった
https://archive.is/r4i8e
35/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
this.setState({secondsElapsed:!this.state.secondsElapsed!+!1});
は、お示しいただいたようなコードではなく
state!=!{!totalClicks:!state.totalClicks!+!1!};
にあたります。その場合の実行結果は
42
42
43
42
となり、ちゃんと「バックアップ」がとれていることがわかります(すでに上のほうの
「追記」に書いたことです)。もちろん、これも 変数state自体に対する破壊的代入
(stateが参照するオブジェクトの中身の破壊的更新 ではありません)ですので、関数的で
はありません。ReactのsetStateは関数的でない(私の知る限りFacebook社もそんなこと
は言っていない)と私も何度も言っている所以です。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
36/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 24, 2015 17:59
'Thank
どなたか、Lambada氏のお絵描きアプリで、メモリリークを観察できた方、いらっしゃい
ますか?
再現方法がわかりません。
あと、jsにおいてmap関数からraduce関数を合成するにはどうしたらよいでしょうか?
(これはトピ違いですが、せっかくなので)
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 25, 2015 09:22
'Thank
嫌がらせコメントはやめてください。
以上。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Lambada
0 contribution
Jul 26, 2015 01:37
'Thank
岡部氏の最新の記事を極めて素早く発見・ご紹介いただきありがとうございます。が、す
https://archive.is/r4i8e
37/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
岡部氏の最新の記事を極めて素早く発見・ご紹介いただきありがとうございます。が、す
でに実例も交えて繰り返し繰り返しご説明したとおり(一部を下に引用します)、「参照
のコピーによるバックアップ」が可能であることは、FRP (Functional Reactive
Programming)以前に、関数的(functional)すなわちイミュータブルなデータ構造の基本です
。繰り返しになりますが、参照のコピーで「バックアップ」がとれないということは取
1
りも直さず、そのライブラリが内部実装だけでなく外部仕様として(FRP以前に)関数的
ではないことの証左です。そもそも関数的(funcional)ですらないものを、FRP (Functional
Reactive Programming)とは言いません。
(三たびchimetorch様: 参照のコピーで「バックアップ」がとれないということ
は、まさにそのライブラリが内部実装だけでなく外部仕様として、関数的ではない
ことの証左です。言うまでもありませんが、JavaScriptでも関数的あるいはイミュ
ータブルなオブジェクトであれば、一般的に参照のコピーで「バックアップ」が可
能です。Immutabilityを利用した、参照のコピーによる「バックアップ」は、関数
型プログラミングの基本中の基本ですので、ご理解されていないとしたら非常に残
念です。例えば先の関数型クリックカウンターの
!!!!!!!!!!!!this.setState({data:!newData,!total:!newTotal});
を
!!!!!!!!!!!!backup!=!this.state;!//#参照のコピーにより「バックアップ」をとる
!!!!!!!!!!!!this.setState({data:!newData,!total:!newTotal});!//#状態の更新
!!!!!!!!!!!!this.setState(backup);!//#「バックアップ」を用いて状態を巻き戻す
とするだけで、現にカウンターの値が増えなくなり、参照のコピーにより状態の
「バックアップ」と巻き戻しが実現できていることが容易にわかります。同様に参
照のコピーを用いて、ユーザが好きなときに好きなだけ状態を巻き戻せる例も、か
なり前からこちらにありました。一方、岡部氏のworldcomponentを用いたクリック
カウンターは、このように参照のコピーを用いて状態の「バックアップ」や巻き戻
しを行なうことはできませんので、取りも直さず関数的ではないということになり
ます。)
P.S. またうっかりqiitapost様のコメントへのご返信を「chimetorch様」宛に書いて
しまったところ、また特にご指摘もなくchimetorch様からご返信をいただきまし
た。重ね重ね失礼しました。
追伸:「(データ構造の中身の値ではなく)参照のコピーによるバックアップ」 2は、
JavaScriptはもちろん、Lisp, Scheme, OCaml, Haskell等でも重要な、(オブジェクト指
向ではなく)関数型プログラミングの基本的概念です(qiitapost氏や岡部氏は誤解なさっ
ているようですが言うまでもなく、参照はオブジェクト指向とも関数型プログラミングと
も独立の、古くからある計算機科学の超基本的概念です)。ご紹介したWikipediaエント
リにはまさにそのことが書かれておりますが、やはり英語の文章や関数型プログラミング
(や計算機科学)の基本がご理解いただけていないようで、そのような基本を私が和訳し
てご説明する義務もないと思いますのでご容赦ください。
chimetorch様: そのFacebook社による説明は和訳すると
オブジェクトがイミュータブルであれば、全体をコピーするかわりに単に別の参照
を作るだけで「コピー」することができます。参照はオブジェクト自体より遥かに
https://archive.is/r4i8e
38/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
を作るだけで「コピー」することができます。参照はオブジェクト自体より遥かに
小さいので、結果としてメモリを節約し、(undoスタックなど)コピーに依存する
プログラムの実行速度を向上する可能性があります。
という意味で、まさに「イミュータブルであれば参照のコピーでバックアップがとれる」
と言っていますが…。
var!map1!=!Immutable.Map({a:1,!b:2,!c:3});
var!clone!=!map1;
の
var!clone!=!map1;
がまさに「参照( map1 )のコピーによるバックアップ( clone )」です。
chimetorch様・qiitapost様: これは何ら「バックアップ」に限った話ではなく(なので私
は常に「」をつけて例示や比喩として「バックアップ」と書いたのですが…)、FRP以前
の、関数型プログラミング一般の話です。何度も繰り返しになりますが、関数型ですらな
いものをFRPとは言いません。先に書いた下の注もご覧ください。
なお、おっしゃっているconstは下のとおり「参照が指しているオブジェクトの中身の破
壊的更新」は妨げません(のでworldcomponentのインスタンスにconstをつけても、それ
が関数的であることには全くなりません)。やはり参照と値の区別や、JavaScriptの仕様
をご理解なさっていないように思われます。
const!i=123;
i=i+1;!//#エラー
const!z={state:123};
z.state=z.state+1;
console.log(z.state);!//#124
chimetorch様: まず、worldcomponentは一度に一つのstateを保持するだけで、どこにも
「ストリーム」の実現は存在しません。そして、「バックアップ」をとるために、おっし
ゃるように別のworldcomponentのインスタンスを用意しなければならないとしたら、そ
れはイミュータブルでも関数型でも(したがってFRPでも)ありません。
qiitapost様: JavaScript標準の Date.now() 関数は(当然ながら)FRPではありませんし、
呼び出すたびに戻り値が異なるので(当然ながら)「参照透明」でもありませんし3、標
準のJavaScriptでは(これも当然ながら)「ストリーム」(無限に長いリスト)とも無関
係です4。誠に失礼ながら、やはりFRPも関数型プログラミングも(SICPも)全くご理解
なさっていないと考えざるを得ません。本物のFRP言語であるElm等で学習されることを
おすすめします。
大変申し訳ありませんが、これまでchimetorch・qiitapost・岡部氏におかれては、参照、
ストリーム、イミュータブル、参照透明性といった関数型および命令型プログラミングの
基本的概念もご理解いただけず、論理的コミュニケーションも不可能で、すべてのご質問
に回答することは非常に困難です。すでに私自身や他の方による数多くの説明や実例をお
示ししましたので、これ以上、そのような基本から私がchimetorch・qiitapost・岡部氏を
教育する義務もありません。ご容赦ください。
https://archive.is/r4i8e
39/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
1. これは別に「バックアップ」に限った話ではなく、リスト(ないしストリーム)や木などの構造デ
ータを他の関数に渡したり、他の構造データの中に格納するときなど、関数型プログラミングのあ
りとあらゆる場面で重要です。(FRPやイミュータブルオブジェクトも含みますがそれらに限らず
一般に関数型プログラミングにおいて、構造データを渡すたびに参照ではなく中身をすべてコピー
していたら大変なことになってしまいます。上述のFacebook社による説明にもあるとおりで
す。)
2. より一般的には参照透明性という、関数型プログラムの非常に基本的な性質の一種です(chimetorc
h様:いずれも違います)
3. (qiitapost・chimetorch・岡部氏がおっしゃっているような)「暗黙の引数」などというものを考
えなくて良い、というのが「参照透明性」の意味です。「暗黙の引数を考えれば参照透明」などと
言い出したら、ありとあらゆる関数が参照透明になってしまい、意味がなくなります。
4. (qiitapost・chimetorch・岡部氏がおっしゃっているように)もしJavaScript標準の Date.now な
いし Date がストリームだとしたら、リンク先のSICPでいうところの stream-car や stream-cdr
に相当する、ストリームに対する基本操作はどのように定義されるのでしょうか??(無論、同じ
ストリームに同じ操作を適用した結果は、「暗黙の引数」など無しで、常に同じでなければなりま
せん。) また、ストリーム(無限リスト)であれば例えば第2要素を取り出した後でも普通に第1要
素を取り出せるはずですが、DateないしDate.nowに対して何をどうすればそれができるのでしょう
か???
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
honeycitron72
0 contribution
Jul 26, 2015 09:24
'Thank
彼はブログで「複数名の有志により見解が示されている」という極寒のコメントをされて
https://archive.is/r4i8e
40/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
いますが、彼の理屈では記事を書いたことのない人のコメントは「捨て垢」ですので、な
ぜ「同調的」なコメントだけ捨て垢として扱わないのでしょうか?
あたし、春日井久美子は知りたい!
honeycitron72
0 contribution
Jul 26, 2015 09:28
'Thank
誰に対する名誉毀損コメントをしたというのですか?qiitapostさん、言いがかりはやめて
ください。そのTwitterもしりません。
The user qualification of the comment's author is cancelled.
honeycitron72
0 contribution
Jul 26, 2015 09:46
'Thank
繰り返しますが、qiitapostさん、言いがかりはおやめください。よそのサイトから引っ張
ってまで、こじつけ。あたしはあたしです。ここはクィータなのですよ。
The user qualification of the comment's author is cancelled.
honeycitron72
0 contribution
Jul 26, 2015 09:51
'Thank
人違いをしておいて謝罪もないのですか?qiitapostさんに謝罪を求めます。あなたが証拠
を示すのが義務です。
honeycitron72
0 contribution
Jul 26, 2015 09:53
'Thank
もう一度言いますがqiitapostさんがUCLAを卒業したというのは学歴詐称です。なかった
ことにしてはいけません
The user qualification of the comment's author is cancelled.
honeycitron72
0 contribution
Jul 26, 2015 09:58
'Thank
統計というからには、確率を提示してください。証明プロセスと計算式もお願いします。
qiitapostさんの謝罪を求めます
The user qualification of the comment's author is cancelled.
honeycitron72
0 contribution
Jul 26, 2015 10:07
'Thank
きちんと同一であると証明して。あたしは違うと一次情報を表明しました
https://archive.is/r4i8e
41/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
honeycitron72
0 contribution
Jul 26, 2015 10:13
'Thank
あなたの言ってることは飛躍がありすぎです。qiitapostさんの言うことは無理がありすぎ
ます。そもそもIDが一致したらどうして同じになるのですか?私がIDを「故意に一致」さ
せたとしても、そのTwitterの人と同一とは言えませんよ。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
honeycitron72
0 contribution
Jul 26, 2015 10:23
'Thank
勝手に話を進めないでください。岡部さんとはどなたですか?そして小数点以下何桁なの
ですか。まだ検算なのですか?
The user qualification of the comment's author is cancelled.
honeycitron72
0 contribution
Jul 26, 2015 10:32
'Thank
ああ、著者ですか。確かに岡部という名前ですね。qiitapostさん、失礼しました。その著
者なら知ってます。でもあたしはこの著者のことを書いてませんよ。あと、そのTwitterの
ハニーシトロンさんは、著者を侮辱してるのでしょうか?最後の投稿が2013年なので、ど
うしてなのかな、と。
あと、計算結果は出ましたか?関数型でなくても良いですよ。
OmankBSD
0 contribution
Jul 26, 2015 10:39
'Thank
そもそもhoneycitron72氏は再三にわたってqiitapost氏をバイネームでコメントしているの
に、なぜchimetorch氏が反応しているのか。
The user qualification of the comment's author is cancelled.
honeycitron72
0 contribution
Jul 26, 2015 10:41
'Thank
ノンスターターさん、失礼しました。以後、慎みます
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
42/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
nonstarter
2015/11/05 0:41
Jul 26, 2015 10:48
'Thank
179 contribution
@chimetorch さん
「オフトピ」に該当するという趣旨であれば、本体記事作成者として必要なコメントをす
る裁量の範囲内であると考えます。そしてもし「オフトピ」に関する関心があるのであれ
ば、chimetorchさんにはhoneycitron72さんとのID云々を巡るやりとりこそが「オフト
ピ」だと自覚して頂きたいと思います。
The user qualification of the comment's author is cancelled.
nonstarter
Jul 26, 2015 11:02
'Thank
179 contribution
@chimetorch さん
著者の著作と振る舞いについての私の一定の見解は示すにせよ、私はコメント欄で「岡部
氏を攻撃」などしておりません。そして、honeycitron72さんはUCLA云々をqiitapostさん
についてのことだと明示されたようですが、kenokabeさんとなんの関係があるのでしょ
うか。「そもそもあなたの2ch語丸出しの不
な言動がそうですし」に到っては意味不明
です(2chを閲覧することはありますが「2ch語丸出し」とか「不
」とか言われまして
も……)。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
honeycitron72
0 contribution
Jul 26, 2015 11:37
'Thank
勝手なことを言わないでください。ノンスターターさんの要望なので、私が削除しまし
た。
nonstarter
179 contribution
Jul 26, 2015 11:41
'Thank
@honeycitron72 さん
ありがとうございます。こちらでも私の不要になったコメントは削除しました。
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 26, 2015 11:49
'Thank
普通ではない「読み取り」にまで責任は持てません。
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
43/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
nonstarter
2015/11/05 0:41
Jul 26, 2015 11:55
'Thank
179 contribution
さようですか。
OmankBSD
Jul 26, 2015 11:56
'Thank
0 contribution
本当に名誉棄損だと思っているなら、司法に訴え出ればよいではないですか?しないの
は、そうではないと理解しているからです。
The user qualification of the comment's author is cancelled.
OmankBSD
Jul 26, 2015 11:59
'Thank
0 contribution
あ、そういえば別人なんでしたね。
nonstarter
Jul 26, 2015 12:01
'Thank
179 contribution
@BeastTadokoro さん
民事にせよ刑事にせよ手間と時間(と民事なら訴訟費用)がかかりますから、権利が侵害
されたとか、違法行為だとか思ったとしても、コストを考えて司法に訴えることをしない
ということはよくありますし、訴えるかどうかも個人の自由です(たとえば裁判を受ける
権利の濫用などにならない限りにおいて)。ですから、そのような言い方は避けられたほ
うが宜しいでしょう。
そもそも(chimetorchさんの主張によるところの)「被害当事者」ではないchimetorchさん
に、司法に云々のようなことを言っても
無いことだとは思いますが。
nonstarter
179 contribution
Jul 26, 2015 12:02
'Thank
私が岡部氏でないことは、すでに否定していますが、何度も否定を繰り返さなけれ
ばならない理由は何でしょうか?
これは流石に誤記ということで宜しいんですよね?
honeycitron72
0 contribution
Jul 26, 2015 12:03
'Thank
運営に確認せずに断じたのですね。メモリリークの裏もとらずにメモリリークが起こって
ると断じるそそっかしさと似ていますが、とりあえず、私の削除コメントについてはいく
らでも運営に確認してもらってかまいません。まあ、私がこう書いた以上は、引っ込みも
つかないでしょうから確認しないでしょうけど
https://archive.is/r4i8e
44/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Jul 26, 2015 12:05
'Thank
nonstarterさん
確かにそうですね。
chimetorchさん(qiitapostさん)は被害当事者ではないですが、「義憤」のために岡部氏
の代弁をされているのかもしれません。それならば合点がいきます。
以後、ROMモードに入ります。
※ちなみに私の名前は「塚 田所」です。ビースト田所と名乗ったことは一度もありませ
ん。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Jul 26, 2015 12:09
'Thank
すぐに訂正削除したコメントに嬉しそうに食いつかなくで結構です。
nonstarter
179 contribution
Jul 26, 2015 12:10
'Thank
すぐに訂正削除したコメントに嬉しそうに食いつかなくで結構です。
私のコメント時点ではそのコメントは端的に存在したのであって、エスパーではありませ
んので「すぐに訂正削除したコメント」かどうかなど判別しようもありません。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Jul 26, 2015 12:18
'Thank
「統計的に天文学的確率」の意味がわからないですし、具体性がゼロですね。よくそれで
技術の話できますね。
https://archive.is/r4i8e
45/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
技術の話できますね。
"ビースト 田所"だけでもいろんな情報が検索にひっかかってきますが、私の理解する天
文学的確率とは意味が違うようですね
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 28, 2015 14:56
'Thank
30%
JavaScript標準のDateは関数型プログラミングのストリームであり、.now()関数の返
り値も参照透明ですよ。
( ゚д゚)ポカーン
それにしても
import!Graphics.Element!exposing!(..)
import!Mouse
main!:!Signal!Element
https://archive.is/r4i8e
46/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
main!:!Signal!Element
main!=!Signal.map!show!countClick
countClick!:!Signal!Int
countClick!=!Signal.foldp!(\clk!count!:>!count!+!1)!0!Mouse.clicks
このElmのコードのどこに「(同じ引数で)呼び出すたびに値の異なる」ものがあるんで
すかねえ……
まさか main とか countClick みたいなシグナルがそうだとか言わないですよね……
@Lambadaさんの徒労感は推察するに余りあるものがあります……
The user qualification of the comment's author is cancelled.
nonstarter
Jul 28, 2015 15:08
'Thank
179 contribution
(同じ引数で)って、countはMouse.clicksに応じて時間変化するだろうに・・・
うわあ……
同じラムダ式 (λx.x) が (λx.x) 1 とか (λx.x) 2 とか異なった値に順次適用されるたびに
「時間の変化に応じて x が 1 から 2 に変化している!」とか言っちゃうんですかね。凄い
なあ。
これはあれですね、 map (\i -> 2*i) [1,2,3,4] (== [2,4,6,8] )で i が「変化」す
るんだって考えるのは、 i をループカウンターみたいに考えがちな命令型に慣れきった人
ならではの発想ですね。でいずれにせよ、関数の仮引数が呼び出しごとに実引数に応じて
別の値になるのは参照透明性と何の関係もないんですが:
t1 = Date.now(); (0∼9まで足してコンソールに表示); t2 = Date.now();
console.log(t1 == t2);
と
t1 = Date.now(); (0∼9まで足してコンソールに表示); t2 = t1; console.log(t1 ==
t2);
とで結果が異なる、という Date.now() の単純明瞭この上ない「参照不透明性」をどうす
るつもりなのかはまったく
のママなわけです。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
47/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 28, 2015 16:23
'Thank
いえいえもうこれ以上贅言を費やしていただかなくても qiitapost さんと chimetorch さん
以外の読者の皆さんは
JavaScript標準のDateは関数型プログラミングのストリームであり、.now()関数の返
り値も参照透明ですよ。
だけでもうお腹いっぱいですよ。
どこか別の星の「参照透明性」の話をされていることが読者に判明しましたので、いやは
やめでたいことです。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 28, 2015 16:39
'Thank
fun event -> k (‘Down(event.mouse_x, event.mouse_y))
というラムダ式の event.mouse_x が、ラムダ式が適用される際の実引数ごとに違う値を
取ることと参照透明性はなにも関係ありませんけど? map (\i -> i*2) [0,1,2,3..9]
https://archive.is/r4i8e
48/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
取ることと参照透明性はなにも関係ありませんけど? map (\i -> i*2) [0,1,2,3..9]
の i が呼び出しごとに違う値を取るかどうかが i の参照透明性に関係がないようにね。ラ
ムダ式内部で仮引数 event を破壊的に更新するでなし、どうやって event や
event.mouse_x が参照不透明だとおっしゃるのやら見当もつきません。
で、結局 Date.now(); のあからさまな参照不透明性の始末はどうつけるんですか?
The user qualification of the comment's author is cancelled.
nonstarter
Jul 28, 2015 16:45
'Thank
179 contribution
実行した際に、実行する度に、実行している途中で、結果が異なる、という
countClick,Mouse.clicks,countの単純明瞭この上ない「参照不透明性」をどうする
つもりなのかはまったく
のママなわけです。
ラムダ式の仮引数 count は論外だし、countClickもMouse.clicksもどれもシグナルで時間
不変な値なんですけど。シグナルを無限リストだと考えるなら(離散時間なら意味論的に
はまあそれでいいので)各要素が違う値を取ることが、その無限リストをどう「参照不透
明」にするんですかねえ。
Date.now() 同様に参照不透明になる(と考える)コード例でも示してくだされば宜しい
のですよ。簡単でしょう?
いやはや……お相手するのは徒労にもほどがありますね。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 28, 2015 17:08
'Thank
話のズレっぷりがもう……
あなたが「Date.now();のあからさまな参照不透明性」を主張するならば、まったく
同様に時間関数の返り値となる「eventやevent.mouse_xが参照不透明」でないと
褄が合わない
なに言ってるんですかねえ。関数の仮引数の値が呼び出しごとに違う値になるのは参照透
明性とはなんの関係もなく(つまり実引数が同じときには常に同じ結果になるかどうかと
https://archive.is/r4i8e
49/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
明性とはなんの関係もなく(つまり実引数が同じときには常に同じ結果になるかどうかと
いう問題とは関係がなく)、これに対して Date.now(); は実引数(まあ空なんですけ
ど)が同じでも返ってくる値が異なるので明らかに参照不透明だ 、という話なんですが。
まったく違う問題なので「
褄が合わない」もヘッタクレもありません。
この手の根本的な理解不足には付き合いきれません。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 28, 2015 17:19
'Thank
参照不透明性の鑑みたいなコード出されて「参照不透明ではない」とか言われても。
その t とやらがまさに状態としてコードの参照透明性を破壊していることにいつまで気が
付かないんですかね。
「 Date.now(); の実引数に暗黙の引数 t がある」とでも?
それこそ Date.now(); の参照透明性を破壊するものなんですけどね。
ま、どうせおわかりにならないでしょうけれど。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
nonstarter
179 contribution
Jul 28, 2015 17:33
'Thank
じゃあ、その引数のtは何かというと、「空」なわけないでしょうが。聞いてまし
た?
だーからtなんですよ。「空」でなく「ユーザの現在時刻」としてのtですよ。
まさしく参照不透明性の原因がそこにあるわけですけどね。
あと意味不明かつ正体不明な擬似コード(にもなってないもの)みせられても反応しよう
がありません。
まあ、好きにしたらいいですよ。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
50/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
MIT_GEEK
0 contribution
Jul 28, 2015 20:04
'Thank
@nonstarter Date.now()が参照透明という主張は国内・海外問わず、私も正直、初めて見
ましたが、新説をそう頭ごなしに否定するのは、どうなのかな、と思いますが。
確かにそういう学者さんはおそらく世界中でも一人もいないかもしれませんが、新説とは
えてしてそういうものでは?
あるいは、日本でだけ、共有されていない常識なのかもしれませんし、早計ではないでし
ょうか。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
keFun
0 contribution
Jul 28, 2015 20:45
'Thank
Wikipedia の「参照透過性」の項目には
参照透過性(さんしょうとうかせい、英: Referential transparency)は、計算機言語
の概念の一種で、文脈によらず式の値はその構成要素(例えば変数や関数)によっ
てのみ定まるということを言う。具体的には変数の値は最初に定義した値と常に同
じであり、関数は同じ変数を引数として与えられれば同じ値を返すということにな
る。
と書いてあります。
またオンライン版の『Learn You a Haskell for Great Good!』にも
if a function is called twice with the same parameters, it's guaranteed to return the
https://archive.is/r4i8e
51/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
if a function is called twice with the same parameters, it's guaranteed to return the
same result. That's called referential transparency ...
と書いてあります。
これらの文章を読めば UCLA を卒業した岡部氏でなくても分かると思いますが、関数に関
して言えば、「参照透過性(参照透明性)」とは「ある関数に同じ引数を渡せば、必ず同
じ値が返ってくること」です。
ところが Data.new() は引数としては何も渡していないのに、毎回異なった値が返ってく
るんですよね。これのどこが参照透明なんですか?
それと、どちらかの方(コメントの芸風があまりにも似過ぎていて私には区別がつきかね
ます)のコメントに
Date.now()の場合、具体的には、暗黙の了解としてユーザの現在時刻Tがnow()の引
数になっています。
と書いていますが、そもそも引数とは明示的に関数に渡すものではないですか?
Date.now() がユーザーの現在時刻を元に値を返すなら、それは Date.now() がユーザーの
現在時刻を「参照」しているだけではないのですか?
もしかしたら、岡部氏や qiitapost さん、chimetorch さんは私たちとは違う次元に住んで
いて同じ言葉でも違う意味になるのかもしれませんね。
異次元に住んでいる人たちと交流できるなんて、Qiita ってすごいですね。
OmankBSD
Jul 28, 2015 20:49
'Thank
0 contribution
みなさん、リラックスしてディスカッションしましょう!
熱く、激しく、しかし紳士的に! 「売り言葉に買い言葉」ではいけません!!
折角ですので、Qiitaではなく、より多くの方々に注目してもらえるよう、海外のコンテン
ツで英語で話すのはいかがでしょうか。岡部さんの主張を手分けして英訳して公開しても
良いでしょうか?
The user qualification of the comment's author is cancelled.
OmankBSD
Jul 28, 2015 20:55
'Thank
0 contribution
「まだまだ噛んだら味がしますし、もう少し穴を掘り下げさせてやろうと思います。」っ
て無意味な
りにしか見えないんですがそれは良いんですかね・・・・
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
52/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Jul 28, 2015 21:01
'Thank
変な絡み方はやめてください。迷惑です。
↓繰り返しますが、私はそのお話とは完全に無関係です(笑い)。トピ主にも迷惑なの
で、おやめください。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Jul 28, 2015 21:15
'Thank
そんなことは、余計なお世話と言うものです。私も勤労者であり、勉強になる事は沢山あ
りますがいずれにせよあなたには関係ありません。私にわけのわからない絡み方をするの
は、やめて下さい。迷惑です。何度も何度もお願いしています。理由はわかりませんが、
不快ならば無視願います。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 08:08
'Thank
自分にとって不都合・気に食わない言論を、何らかの陰謀論やレッテル貼りで無効化しよ
うとする態度は不誠実で感心しませんね。
@keFunさんは「毛ファン」とやらなんでしゃうか?そもそも毛ってのもよくわかりませ
んが
Q_Jirou
0 contribution
Jul 29, 2015 08:15
'Thank
@MIT_GEEK ご本人は、海外サイトであっても、誰にも同意頂けないことは理解されてる
と思いますよ。
https://archive.is/r4i8e
53/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
Jul 29, 2015 08:45
'Thank
0 contribution
@keFunさんはどのぐらいの確率なんでしょうね・・・・
The user qualification of the comment's author is cancelled.
Q_Jirou
Jul 29, 2015 09:56
'Thank
0 contribution
謗中傷はおやめください。あなた粗暴な口のきき方は改めた方が良いです。もう二度と
異常者などとは言わないと思いますが、感心しません。
The user qualification of the comment's author is cancelled.
Q_Jirou
Jul 29, 2015 10:08
'Thank
0 contribution
どのように独自解釈してるのか、8086でも何でも良いので低レベルのコードで示していた
だくと私もわかりやすいのですが・・・
The user qualification of the comment's author is cancelled.
Q_Jirou
Jul 29, 2015 10:17
'Thank
0 contribution
私が知る統計論や論証とはずいぶんと趣が違っててモヤモヤします。 異常者と言うことがどうして
謗中傷でないのか、その根拠が2ちゃんねるというのも不
思議ですし、仮に「統計的」に「論証」されたとしても(まだのようですが)、異常者と
言っても
謗中傷にならないという理解も解せませんね。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
https://archive.is/r4i8e
Jul 29, 2015 10:21
'Thank
54/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
そんな訳の分からない理屈で私が疑われていたのであれば、これ以上あなたと対話するこ
とは意味がありませんね。
謗中傷さえ改めていただけるのであれば、これでおしまいにします。
尚、私は「異常者」だと言われたから、それは
謗中傷だと怒っているのであって、私の
知らない集団が異常者の集団だと仰ることには興味はありません。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 10:25
'Thank
低レベルのコードにおきかえて立論してもらえるとより多くの方がミステリーに迫れるか
と思いますが、いかがでしょうか
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 10:27
'Thank
私は、2ちゃんねるはここ数年利用したことはありません。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 10:28
'Thank
低レベルなコードで書けないのですか?
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 10:30
'Thank
統計的に立証されたのでしょうか?
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 10:36
'Thank
誰と誰の議論ですか?
https://archive.is/r4i8e
55/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
むしろ、qiitapost名義含め、あなたの言ってることについていけてる人が日本にいるの
か、という疑問は確かにありますが。
The user qualification of the comment's author is cancelled.
Q_Jirou
Jul 29, 2015 10:41
'Thank
0 contribution
http://qiita.com/esumii/items/ec589d138e72e22ea97e
このエントリは良質で、コメント欄でも概ね好反応なのでまずはここを読むことをおすす
めいたします!
Linked from
comment on
「関数型言語」に関するFAQ形式の一般的説明 3 months ago
Q_Jirou
0 contribution
Jul 29, 2015 10:43
'Thank
nonstarterさんが捨てアカだというのはなぜですか?また、それだとどうだと言うのです
か?
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 10:48
'Thank
nonstarterさんを捨てアカと罵った根拠については取消ですか?
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 10:50
'Thank
住井先生の名前やローマ字表記をどうもじったら Q_Jirouになるのでしょう。統計的な観
点でご説明願います。
Q_Jirou
0 contribution
Jul 29, 2015 10:51
'Thank
そうではなく、なぜ捨てアカだと決めつけるのか、ということです。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 11:04
'Thank
私はQ次郎という名前ではなく、名乗ったこともないですし、IDがQ_Jirouなだけですし、
住井先生のお名前を「A二郎」などと解釈する奇特な発想も無いですし、藤子漫画の「オ
https://archive.is/r4i8e
56/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
住井先生のお名前を「A二郎」などと解釈する奇特な発想も無いですし、藤子漫画の「オ
バケのQ太郎」にはQ次郎などというキャラクターは出て来ないようです。
いくらなんでも無茶苦茶ではないですか。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 11:12
'Thank
確率や統計という言葉を多用される割には随分と乱暴な言い草ですね。悪質な商材の広告
にありがちな「統計的には∼」と書いておけば煙に巻ける文言みたいで不誠実です。
さらに、提督(ゲーム?)とかいうわけのわからない存在との関連まで疑われ出したの
で、これ以上は対話が困難なので撤退します。
(「なぜnonstarterさんが捨てアカだと思うのか」という質問にも、答えをはぐらかされ
るので)
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 11:42
'Thank
やはりお答えいただけないので残念です。
Q_Jirou
0 contribution
Jul 29, 2015 11:44
'Thank
@qiitapostさんは捨てアカですよね?
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 11:53
'Thank
@qiitapostさんに質問したのですが、とりあえず @chimetorch さんが捨てアカウントとし
て書き込まれている悪質なユーザーなのは理解しました。
ひょっとして、あなたは岡部健さんなのですか?
また、私は捨てアカウントではありません。正規の利用者です。
捨てアカウントで「議論」なんて、不誠実ですね。
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
57/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
Q_Jirou
0 contribution
2015/11/05 0:41
Jul 29, 2015 12:18
'Thank
あなたにこの場を仕切る権限はありません。
捨てアカなのであれば、荒らしも同然なので、処分される前にご自身が身を引くべきで
す。
The user qualification of the comment's author is cancelled.
keFun
0 contribution
Jul 29, 2015 14:02
'Thank
@qiitapost
説明済み。なんで説明されている質問をまた繰り返すのですか?
私が質問をする以前に既に説明があったのですね。
冗長で話のポイントがつかめない文章がダラダラと続いていたので、どこに説明があった
のかわかりませんでした。
私が質問した後に改めて説明をしていただいたようですが、次元が違い過ぎるのか私には
理解すらできませんでした。
できれば私が住んでいる次元の言葉で説明していただけないでしょうか?
2.それは Date.now() がユーザーの現在時刻を「参照」しているだけではないので
すか?って、「引数」にする方法があれば教えてください。すでに不可能なことは
ちゃんと説明しましたが。
What are you talking about ?
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 29, 2015 14:54
'Thank
とりあえず、複数のアカウントを用いて議論を演出するのは今後は控えた方が良いです
ね。
どちらかに統一して頂かないと皆さんも、(ご本人も)混乱するので。
nonstarter
179 contribution
Jul 29, 2015 15:13
'Thank
Qiitaの他の記事に対するchimetorchさんのコメント
http://qiita.com/esumii/items/ec589d138e72e22ea97e#comment-ce0d42fef66176d2bd6d
とそれに対するdiffさんの指摘
http://qiita.com/esumii/items/ec589d138e72e22ea97e#comment-67aa502e7866647ce28
https://archive.is/r4i8e
58/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
6
を見るとなんか色々なことを考えてしまいますね。なお念のため、このページのアーカイ
ブは
https://archive.is/MpQRC
にあります。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
MIT_GEEK
0 contribution
Jul 29, 2015 19:28
'Thank
あんたら、そろそろ他でやるとか考えたらどうだ。nonstarter様次第ではあるものの、そ
れにしてもひどいです。
住井博士も著者も困っているのでは。
Q_Jirou
0 contribution
Jul 29, 2015 19:37
'Thank
申し訳ございません。良質の記事なので彼の参考になると思ったのですが、まさか住井先
生の数ヶ月前の記事に対して暴れに行くとは思いませんでした。
住井先生は関数型言語の分野では岡部氏とは比較にならないほどの支持や業績もあり、か
つ彼が憧れるところの国際レベルのフィールドでも活躍されている方なので、少なくとも
彼は住井先生を素人呼ばわりはしないでしょうし、神妙になるかと思い、教示したのです
が裏目に出ました。
代わってお詫び申し上げます。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Jul 30, 2015 22:25
'Thank
すごい
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 31, 2015 09:53
'Thank
世界中探してもそのようなことを言ってる人はおそらく一人だけでしょう。
https://archive.is/r4i8e
59/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
「超自明」な事であれば沢山いても良いはずなのですが・・・・。「超暗黙知」なのか
な。
関連する論文があれば拝読させて頂きたく思います。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 31, 2015 13:03
'Thank
そうではなく、あなたか岡部健さんの論文です。論文へのリンクをお願いします。
「たくさん」では小学生といっしょなので、一人か二人、そのエンジニアさんか学者さん
の名前をお願いします。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 31, 2015 13:36
'Thank
世界というのは例えばペンシルバニア大学やUCLAやその他の大学の有識者も含まれます
か?
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 31, 2015 13:51
'Thank
なるほど。捨てアカウントだから出さないのであって、表の顔では既に書かれているので
すね?
それは、査読論文ですか?
Q_Jirou
0 contribution
Jul 31, 2015 13:53
'Thank
なるほど。ペンシルバニア大学などでは「共有されている常識」という主張、承りまし
た。
The user qualification of the comment's author is cancelled.
https://archive.is/r4i8e
60/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 31, 2015 14:07
'Thank
謗中傷はやめてください。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 31, 2015 14:24
'Thank
荒らしではありませんし、アカウントも捨てアカウントではないですし、複数のアカウン
トを使い分けて会話してるように見せかけたこともありません。
2ちゃんねるのことも私は知りません。
言いがかりばかりおやめください。
Q_Jirou
0 contribution
Jul 31, 2015 14:25
'Thank
stackoverflowでなら支持の声もあって、また話は違ってたのかもしれませんね。
翻訳してもらって公開しても良いですか?
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 31, 2015 15:02
'Thank
私はそんなこと名乗っていません。
言い掛かりはおやめください。
それに、その名前は私が最初からプロフィール欄に書いていたもので、変更していませ
ん。
にもかかわらず私を「Q次郎」などと言ったり、今度はKen Okabeを っていると言った
り、
もう無茶苦茶ですね。腹が立ちます。
The user qualification of the comment's author is cancelled.
Q_Jirou
https://archive.is/r4i8e
Jul 31, 2015 15:13
61/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
Q_Jirou
2015/11/05 0:41
Jul 31, 2015 15:13
'Thank
0 contribution
40%
KenOkabe、あるいはOkabeKenだなんて名乗ったことは一度もないですし、Q次郎と名乗
ったこともありません。
証拠もないのに言いがかりはやめてください。
The user qualification of the comment's author is cancelled.
Q_Jirou
Jul 31, 2015 15:20
'Thank
0 contribution
私は
っていませんし、そんなことをしたら、規約違反とみなされるかもしれませんね。
通報すれば処分が下るでしょう。
ただ、私は
っていませんし、そんな証拠も無いですから何も起こりません。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 31, 2015 15:44
'Thank
なんとも、分かり合えない人も居るものですね・・・・。
他の方にもやたらと挑発的な言動を繰り返し、私のことを何度も「異常者」だの「荒ら
し」だの言ってるあなたが、逆に処分されないことを祈ります。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
kmizu
0 contribution
Jul 31, 2015 18:52
'Thank
@unstartere 氏はqiitaにコメントを残すことにやっきになられるよりも、別の場所で持論
を展開された方が有意義ではないでしょうか。
The user qualification of the comment's author is cancelled.
kmizu
0 contribution
Jul 31, 2015 19:08
'Thank
いやまあ、私が @unstartere さんにとって有意義かどうか期待しているかについて、期待
してないというのはその通りですね。正直なところ、これ以上コメント欄汚染しないでご
自身のブログで情報発信される等すれば、少なくとも私にとっては有意義ですね。それと
も、qiitaのコメント欄にこだわる理由があるのでしょうか?
https://archive.is/r4i8e
62/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
kmizu
0 contribution
Jul 31, 2015 19:37
'Thank
あのー、 @unstartere さんは自らが毛の壁と呼ばれていた kenokabe 氏であることをお認
めになるのでしょうか?
念の為ですが、「毛」だの「毛の壁」だけでも、侮辱罪で起訴猶予ひとり行ってお
り、
あなたの言動は「有意義」レベル以前に刑法に抵触する犯罪行為ですが、しょせん
限度を超えるか超えないかの問題で
あることを明確にしておきます。
構いませんよ、そのつもりなら。
という文章からは、ご本人であるとしか思えないのですが。その辺明らかにしていただき
たく。
kmizu
0 contribution
Jul 31, 2015 19:38
'Thank
ちなみに私の言動が刑法に抵触する犯罪行為だとお考えならどうぞ起訴してみてはいかが
ですか。どうせ相手にされないとは思いますが。
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
megascus
0 contribution
Jul 31, 2015 19:47
'Thank
訴訟をおこす気がないのに訴訟をちらつかせて相手の意見を封じようとするのはいわゆる
恐喝なので逮捕されてもおかしくない事案です。
自分から起訴猶予という訴訟をイメージさせる言葉を使っておきながらそのつもりはなか
ったというのは許されないのでぜひ訴訟してください。
Q_Jirou
0 contribution
Jul 31, 2015 19:47
'Thank
もうやめましょうよ。捨てアカウントではなく、先程アカウント剥奪された方でないのな
ら、攻撃的にならずにディスカッションするべきです。法的な恫喝は禁じ手です。
The user qualification of the comment's author is cancelled.
MIT_GEEK
0 contribution
https://archive.is/r4i8e
Jul 31, 2015 20:04
'Thank
63/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
0 contribution
'Thank
@unstartere 貴方はどなたなのか?それをハッキリさせて貰わないと我々も筋がつかめな
い。「起訴するかしないかは検察官が決めることで市民が決めることではありません」と
いうのはもっともだが、あなたが著者でないとするならば、それを言うなら被害届を出す
のかどうかを決めるのは著者であって、なぜあなたがそこまでのことを踏み込んで話すの
だ!?
犯罪行為だの告訴だの、そんなことを持ち出さないと議論できないのか?
愚か者のお二人は退場したが、少なくとも言動の野蛮さから、 謗行為に最も近かったの
はあのお二人だ。あなたも二の舞になりますぞ。
kmizu
0 contribution
Jul 31, 2015 20:09
'Thank
@unstartere とりあえず貴方が何者かを明らかにしましょうよ。匿名の捨てアカウントで
批判をすることは、貴方の支持者である岡部 健氏が最も批判していたことだったと記憶
しています。 @unstartere という明らかに @nonstarter 氏を意識した匿名の捨てアカウン
トで批判しても空しいだけですよ。
私は実名を明らかにしたアカウントで堂々とやっていますよ。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 31, 2015 20:41
'Thank
@unstartere あなたは岡部健さんだとお認めになったようで少なくとも例の2アカウントの
輩でないことはわかりましたが、そんなに不当だと思うなら、黙って出るところに出れば
よろしい。前口上のみで我を通せるほど、世の中甘くはありませんよ
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Jul 31, 2015 21:01
'Thank
@unstartere 岡部健さん、なぜまたQiitaに現れたのですか?未練があるのですか。それと
も義憤ですか。
なんにせよ、処分された2人みたいな乱暴な言葉使いはおやめください。
迷惑です。
diff
0 contribution
Jul 31, 2015 21:09
'Thank
ちなみにさきほどの件で起訴猶予となった人物は、あなたと同じことを豪語してい
ました。ザマないですが。
https://archive.is/r4i8e
64/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
@unstartere さんは、本投稿で議論されている『関数型プログラミングに目覚めた!
IQ145の女子高生の先輩から受けた特訓5日間』の著者である岡部健氏という認識で問題な
いでしょうか?
The user qualification of the comment's author is cancelled.
Q_Jirou
Jul 31, 2015 21:14
'Thank
0 contribution
あなたもですか。私はそのような名前は名乗っていません。
The user qualification of the comment's author is cancelled.
Q_Jirou
Jul 31, 2015 21:27
'Thank
0 contribution
そんなブログほんとにあるんですかね。
kmizu
Jul 31, 2015 22:04
'Thank
0 contribution
@unstartere ところで、仮に百歩譲って私の言説が
謗中傷だったとして、それは岡部氏
の問題ではないでしょうか?
@unstartere 氏がまるで岡部氏であるかのような物言いが少し気になりました。
The user qualification of the comment's author is cancelled.
diff
Aug 01, 2015 10:30
'Thank
0 contribution
謗中傷犯を告発するブログに書かれている公表されている情報ですよ。わざわざ
「あちら」の記事から同じことを書きにこなくて結構です。
該当する岡部氏のブログを閲覧しましたが、何れの告訴に対しても不起訴処分を言い渡さ
れているように見受けられます。
これらの不起訴処分に対して岡部氏は「嫌疑のある起訴猶予」と説明されており @unstart
ere さんはこれを支持しているようですが、私からすると不起訴処分理由通知書の掲示も
なく「嫌疑のある起訴猶予」だと説明されましても根拠になりません。不起訴理由は「嫌
疑なし」か「嫌疑不十分」だったという疑念が払拭されません。
なお、告訴の理由となった
称につきましては、"kenokabe"という誤読を招きかねないア
カウント名を考案した岡部氏自身の「ブランディングの失敗」と認識しております。
キャメル記法(KenOkabe)やスネーク記法(ken_okabe)の利用、あるいは欧米式の名姓順に拘らず姓-名順(okabeken)としていれば、
https://archive.is/r4i8e
称が生じるような誤読はされなかっ
65/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
たと考えております。ご参考になればと思います。
OmankBSD
Aug 01, 2015 12:16
'Thank
0 contribution
少なくとも私が理解する「
謗中傷」って、その閾値を超えたコメントに及んでいる人は
昨日アカウントが抹消されたようで、kmizさんの発言なら、なんら該当もしないと思う
し、社会通念に鑑みても該当しないと想像します。「毛の壁」というあだ名に関しては、
そもそもご本人がツイッターなどでそのハッシュタグを積極的に用いたツイート を600回
以上行っているという情報もあるようですし、自分は使うが他人には許さない、という事
は無いでしょうし、そうだとしたら単なるワガママで、捨て置いても良いでしょう。
だって、他人への罵倒にそんなハッシュタグを用いている時点で、被害感情すら無いとい
うことですから。あっても
謗中傷になるレベルのものだとは思えませんし。
いずれにせよ「当事者おいてきぼり」で
※「
謗中傷だ何だと絡むのは気持ち悪いですね。
謗中傷犯を告発するブログ」とありますが、そもそもこの著者自身が 謗中傷行為
によって他人から刑事告訴されているようなので、説得力を感じませんね。
think49
Aug 01, 2015 23:22
'Thank
27 contribution
2015/07/29 19:28 の辺りで Qiita に通報した者です。
未だにお互いに相手を
謗中傷と主張しているコメントが見受けられますが、物事の良し
悪しは主観ですので結論は出ないのではないでしょうか。
(気持ちはお察ししますが、世の中にはどんなに誠意を尽くしても聞く耳を持たない人が
存在します。)
多くの人に害のあるコメントだと思うのでしたら、ページ下部の [ご意見] から本記事
URLと該当コメントを記載して運営に通報することをお勧めします。
このコメントを書く前に私も再度、通報しました。
OmankBSD
Aug 02, 2015 01:58
'Thank
0 contribution
私のコメントの大半を、後ほど一斉に削除します。
理由は、ソックパペットの2匹のコメントが抹消されたことで、私のコメントだけが残留
していても誰も文脈を理解することが出来ないからです。
私からも諸々のコメントをお詫び申し上げます。
また、本人からハンドルネームやIDの文字列に不思議な因縁を付けられる可能性を考慮
し、不本意ではありますがこちらも様子を見て変更しておきます。
The user qualification of the comment's author is cancelled.
OmankBSD
0 contribution
Aug 03, 2015 07:55
'Thank
@unstartereさんは処分された2匹(同一)とまるで言ってる事が似ているんですが、3ア
カウント目の同じ人なんでしょうか。
「2ch語丸出しだ!」だとか、2chからの
https://archive.is/r4i8e
謗中傷メンバーだのなんだの、言ってる事が
66/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
「2ch語丸出しだ!」だとか、2chからの
2015/11/05 0:41
謗中傷メンバーだのなんだの、言ってる事が
そっくりなんですが、ソックパペットなのでしたら止めた方が良いですよ。運営への迷惑
とか考えないんでしょうか。
あと、繰り返しますが #毛の壁 というハッシュタグについてはご本人が500回以上もそれ
を用いているので、(道義上も)なんら問題は無いと考えます。
Q_Jirou
Aug 03, 2015 10:18
'Thank
0 contribution
Twitterの話なんかされても困るしTwitterの(なんら具体性のない)Abuserの話なんかされ
ても、正直わけがわかりませんね。
ご自分の中に存在するシチュエーションがまるで誰にでも共有されているかのような前提
で話をされる癖は改めた方が良いでしょう。
diff
Aug 03, 2015 10:25
'Thank
0 contribution
称については、同様のTwitterハッシュタグを見る限りアカウント名に限らずあら
ゆる要素をとっかかりにくだらない
称を考案することを「得意」とするAbuserが
おり、「誤読」の問題ではないのは明白です。
Abuserが大喜びするような
謗中傷行為を擁護する非常に馬鹿馬鹿しい認識の提示
ご苦労さまです。
@unstartere さんの手短かなご返答におかれまして、下記の岡部氏のブログを比較してみ
ると、「明白」や「Abuser」といった岡部氏特有の言い回しやエッセンスが垣間見えます
が、これはどう捉えたら宜しいのでしょうか。
http://kenokabe-techwriting.blogspot.jp/2015/04/amazon.html
再三の確認となりますが、@unstartere さんは岡部健氏ご本人でしょうか?
仮に否定されたとしても、岡部氏の形態模写までなされてこちらにコメントされる @unst
artere さんの動機は何なのでしょうか?
The user qualification of the comment's author is cancelled.
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Aug 03, 2015 18:37
'Thank
ブスなんて呼び方は明らかに侮辱ですよ。岡部健さんはブスだなんて呼ばれて無いです
し、毛の壁と呼ばれてるだけですね。
何がおっしゃりたいのかよくわかりません。
そもそも岡部健さんはTwitterで説明する過程で、毛の壁という言葉を用いているわけでは
なく、
相手を「チビ・デブ・通風持ち」といった罵倒のツイートにそのハッシュタグを付ける、
https://archive.is/r4i8e
67/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
相手を「チビ・デブ・通風持ち」といった罵倒のツイートにそのハッシュタグを付ける、
という用途ばかりのようです。
あと、挑発的なものの言い方はやめましょう。それこそがAbuseだと思うのですが。
The user qualification of the comment's author is cancelled.
Q_Jirou
Aug 03, 2015 19:22
'Thank
0 contribution
またですか・・・・。本人より明示って、証拠(書類の写真など)が提示されたわけでも
なさそうで、これまでいろんな嘘をついてきた人(Wordpressのアカウント抹消やQiitaア
カウント抹消の理由、弁護士の名前を勝手に用いた事など)ですし、信用しろと言う方が
無理と言うものでしょう。
現在、Twitterで「毛の壁」で検索するだけでも相当な数の人たちが、その言葉を用いてい
ますが、彼らは「犯罪者」なのですかね。私はそうは思いません。
繰り返しますが、coolioさんご自身が、相手を「外道」だの「チビ・ハゲ・デブ・通風・
貧乏・ロリコン」といった
で、これでは
謗中傷行為にそのハッシュタグを文末に付けられているわけ
める要素に乏しいですね。
あと、なんどもいいましたが私はプロフィールなどでKenOkabeと名のったことはありま
せん。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Aug 03, 2015 19:39
'Thank
うーん・・・・お答え頂けないのですね・・・・。
それはさておき、そのテキストはどこからの引用なのですか?そして、あなたはそれの当
事者なのですか?
さらに、それが毛の壁というあだ名で呼ぶこととどう関係してくるのですか?
その引用だけではさっぱり見えません。
その青○さんの御名前を出したりして大丈夫ですか?
引用の最低限のマナーも満たしていないのも、気になります。
ともあれ、Wordpressのページ凍結食らった理由などで「毛の壁さん」が嘘こきまくった
ことの同意は得られたようなので、良かったです。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Aug 03, 2015 19:47
'Thank
うーん、わかりませんね。そもそも犯罪だどうだという話を毛の壁さん本人不在で語って
も意味ないですよ。あなた毛の壁さんの愛人か何かですか?勝手に代弁してるようなもの
の言い方は乱暴です。
さらに、リンクも何も示さない、わけのわからない(引用元にも無礼な)引用をして、さ
https://archive.is/r4i8e
68/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
さらに、リンクも何も示さない、わけのわからない(引用元にも無礼な)引用をして、さ
あどうだと言われてもなんのことやら。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Aug 03, 2015 20:01
'Thank
しつこい人ですね。私はそんなプロフィールにはしていません。あと2ch云々というのも
いい加減にしてください。
削除って、私に何を削除して欲しいんですか?そして、それをあなたが言うのは何故です
か?
誰が誰になんの咎で告訴して、どこにどんな点が認定されたのかさっぱりわからない(い
きなり引用元も示さない引用をしただけ)ですし、きっちり筋道立てて話をしてくださ
い。
運営に通報って、そんなの、好きにすればよいことじゃないですか。なんでいちいち書く
んですか?
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Aug 03, 2015 20:18
'Thank
これ以上は時間の無駄ですね。
最後に繰り返しますが、私はKen Okabeなどと書いたことも名乗ったこともありません。
迷惑なのでさすがに何とかしてほしいです。
The user qualification of the comment's author is cancelled.
MIT_GEEK
0 contribution
Aug 04, 2015 11:22
'Thank
なんだこれは。
Q_Jirou氏は何もKen Okabeなどとは名乗ってないではないか。画像にも、きっちりKen
Obakeとあるではないか。
あと、実名を挙げてそんな記事を書いて大丈夫か?
結局、@unstartere氏は著者の岡部健なのだな?混乱するような振る舞いはやめたらどう
だ。
別人なのか、本人なのか!?卑怯ではないか。
ついでに、本人なら、ページはちゃんと書け。表示が崩れまくってるぞ。ギークなんだろ
The user qualification of the comment's author is cancelled.
MIT_GEEK
0 contribution
https://archive.is/r4i8e
Aug 04, 2015 13:44
'Thank
69/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
自分が読み間違えておいて、訂正もないのか。最初に指摘した!?いつそんな指摘をし
た!?その時はOkabeだったと神に誓って断言できるのか!?
いつ私が擁護した!?明確な間違いを指摘してる。間違いは間違いなのだ。何が嬉しそ
う、だ!
「いずれにせよ」じゃないだろ!ごまかしフレーズは、よしなさい。間違ってるもんは、
間違ってるのだ。訂正せよ。
The user qualification of the comment's author is cancelled.
MIT_GEEK
0 contribution
Aug 04, 2015 13:57
'Thank
いつ指摘されてる!?どれだ?
MIT_GEEK
0 contribution
Aug 04, 2015 14:03
'Thank
断言する、と言っておるが、実際にhttp://qiita.com/Q_Jirou
のGoogleキャッシュを見ると先月18日の時点でObakeになってる。
この人物は嘘吐きである!
なんだこいつは。自分のそそっかしさを認めたくないばかりに、こんな嘘までつくとは呆
れた人物だ。
think49
27 contribution
Aug 04, 2015 14:06
'Thank
@MIT_GEEK さん
横から口を出すようですが、自分の言葉(2015/07/29 19:28)を読み直して冷静になったほ
うがいいのでは…。
**** 氏が Ken Okabe 氏である事は明白である
**** 氏がなりすましである事は明らかだ
**** 氏と **** 氏は同一人物である
**** 氏がふざけた行為を擁護している事が浮き彫りになった
どれもこれも根拠のない憶測でしかありません。
憤りはお察ししますが、それを言葉にしたとして相手に期待通りに伝わるでしょうか。
ここを荒らす行為を助長することにならないでしょうか。
相手が黙らないのなら自分から黙る勇気も必要だと思いますが、どうでしょうか。
議論の発端は「 Date.now() が参照等価的であるか否か」が争点になっていたと記憶して
います。
そちらに争点を戻すならまだわかりますが、今では「誰と誰が同一人物だ」「誰が Ken
Okabe だ」と個人特定に躍起になることが主目的になっているようです。
少なくともここで語るべき内容ではありません。
https://archive.is/r4i8e
70/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
The user qualification of the comment's author is cancelled.
MIT_GEEK
0 contribution
Aug 04, 2015 14:10
'Thank
それもそうだな。
あまりに酷い嘘だったのでヒートアップした。静観する。
MIT_GEEK
0 contribution
Aug 04, 2015 14:11
'Thank
「最初に指摘されてからObakeにでも書き直したんだろう」の最初の指摘がいつなのだ、
と聞いている。お答えを。
Q_Jirou
0 contribution
Aug 04, 2015 14:15
'Thank
もう対話不能なので黙ってるつもりでしたが、一度だけ。
私がOkabeKenと名乗ってると絡まれたのはついぞ最近になってからです。先月の18日前
後でしたら、私は別の荒らしの人から「Q次郎と同一だ!」と絡まれていた真っ最中で、
オバケ名義のことは一度も絡まれてませんね。
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Aug 04, 2015 14:27
'Thank
だから???そこ、繋がりませんよね。
あなたは先月7月17日以前に私のプロフィールを確認したわけでは無いでしょう。
嘘ついて私を貶めておいて、卑劣だとは思わないのですか。
私はunstartereさんのIDはnonstarterさんと似てますが、その事についてとやかく言うつも
りも無いですし、挑発だとも思いませんが、あなたはそう思うのですか?
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
Aug 04, 2015 14:40
'Thank
質問にお答えください。
・私の2015年7月17日以前のプロフィールを見てもいないのに、OkabeKenと名乗ってい
たと虚言を弄したこと
・unstartereという名前は挑発目的で設定したのか
The user qualification of the comment's author is cancelled.
Q_Jirou
0 contribution
https://archive.is/r4i8e
Aug 04, 2015 14:56
'Thank
71/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
Thank
嘘をついたことが確定したので、そのお答で十分です。ここらで失礼します。
それにしても、自分が気にくわないレビューを書いた人の記事に乗り込んで、しかも複数
のアカウントを使い分けて自演しながら、こうやって大量に荒らしコメントをするなんて
最低の著者ですね。
しかも、アカウントを取り直してまだ投稿してるようですし。
The user qualification of the comment's author is cancelled.
diff
0 contribution
Aug 04, 2015 16:00
'Thank
長らく放置されていたブログを更新する等、岡部健氏と @unstartere さんの鮮やかな連携
プレイに感服します。なお不起訴処分理由告知書につきましてはテキストではなく検察官
検事の署名・捺印入りの写真で公開されると決定的な証拠となりますが、こちらがご掲示
されないことは残念です。
公文書で然るべき手続きを踏めば誰でも確認できる公の情報が神戸地検の公文書の
番号付きで示されているので、追認可能な証拠です。
これは誤りです。起訴された場合は刑事事件記録に掲載され「誰でも」閲覧できますが、
不起訴記録は不開示です。(神戸地方検察庁に確認済) 如何にも尤もらしい公文書番号
を提示されていますが「誰でも追認可能な証拠」にはなりませんよ。
当初は岡部健氏の『関数型プログラミングに目覚めた! IQ145の女子高校生の先輩から受け
た特訓5日間』に興味を持ち、それについて調べる中でQiitaの本投稿やDay2・Day3のレビ
ューを知り、nonstarterさんやLambadaさんとのコメントを静観しておりましたが、岡部
氏やその思考を共有する匿名アカウントの方々(qiitapost、chimetorch、unstartereな
ど)には辟易しております。
岡部氏の関数型プログラミングの技術力につきましても、コメント欄での以下の議題を通
じて岡部氏自身が関数型プログラミングを理解していないように見受けられます。
ブログ上でOCamlでGUIアプリを作成せよと述べたにもかかわらず、岡部氏自身はFRP
を用いた実用的なGUIアプリを提示していない。
末尾再帰の最適化を理解していない。
JavaScriptのDateは関数型プログラミングのストリームであり、.now()関数の返り値も
参照透明と主張。
誰しも内容の誤りや記載ミスは発生します。『TAoCP』のKnuth先生も著作の間違いやタ
イポに対して受け売れて修正されております。しかしながら、岡部氏は自身の著作の正当
性のみ主張し続け誤りや指摘を一切受け付けておりません。これは「教育者」としてある
まじき態度です。
また上記の起訴猶予処分の件で岡部氏は虚構癖があると理解しましたので、技術的根拠も
なく誤りを一切認めず虚構癖のある著者が執筆した『関数型プログラミングに目覚めた!
IQ145の女子高校生の先輩から受けた特訓5日間』は読むに値しない技術書だと判断致しま
https://archive.is/r4i8e
72/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
IQ145の女子高校生の先輩から受けた特訓5日間』は読むに値しない技術書だと判断致しま
した。
その代わりとして何ですが、技術評論社から出版されている『関数プログラミング実践入
門』と、関数型プログラミング特集が掲載された『Software Design 2015年8月号』を購
入したいと思います。岡部氏もこれらの技術書から関数型プログラミングの基礎を再学習
されてどうでしょうか? よろしくお願いいたします。
nonstarter2
Aug 04, 2015 16:02
'Thank
0 contribution
正しい情報が消されて間違った情報が残るということに運営は気にならないようなので、
仕方がないので重要な情報を再掲しておきます。
必要な情報が消えることはありません。また@nonstarter氏他に間違ったメッセージを与
えないためにも。
『関数型プログラミングに目覚めた!』のレビュー(Day-1)について
住井 英二郎@esumiiさんとか、らくだの卯之助@camloebaさんに聞きたいのだけど、そも
そも貴方たちはOCamlでデスクトップアプリ書けるんですか?
住井 英二郎@esumiiさんとか、らくだの卯之助@camloebaさんに聞きたいのだけど、そも
そも貴方たちはOCamlでデスクトップアプリ書けるんですか? の続き
プログラミングの世界的潮流と机上の空論としての関数型プログラミング②「素人として
は深入りを避けたいと思いますが、そうだとすればそもそもJavaScript選んじゃったのが
関数プログラミングへの無理解を象徴的に示すものなのだということになるような気がし
ます。」(苦笑)
【学習者要注意!】『関数型プログラミングに目覚めた!』のレビュー(Day-1)の「状
態遷移関数」を使った非FRPのGUIコードがメモリリークする実用に耐えない不良品でし
かなかったことについて 読者
せて楽しいですか?
『関数型プログラミングに目覚めた!』のレビュー(Day-1)の嘘と誤魔化し ー 自分
たちが非実用的な「机上の空論」を語っている事をけして読者に語らないこと
「お絵かきアプリ」と「クリックカウンター」を簡単に実装できると見せかける誤魔化し
と嘘 原理的に可能かどうか?と実用的であるかどうか?は違うが、それを「銀の弾」で
はない、という言葉をもって自らの嘘、誤魔化しの言い訳として悪用するな
worldcomponent関数リアクティブプログラミング(FRP)ライブラリの破壊的代入について
関数型プログラミングと古典物理学の密接な関係
nodeのFRP(関数型リアクティブ)ライブラリ worldcomponent の後継、 worldtimestre
am の公開
JavaScriptで時間発展する物理系=私達が生活するこの宇宙の挙動を、関数型プログラミ
ングでイミュータブルに記述する、という関数型リアクティブプログラミング(FRP)の
https://archive.is/r4i8e
73/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
概念実証
nonstarter2
0 contribution
Aug 04, 2015 16:10
'Thank
ブログ上でOCamlでGUIアプリを作成せよと述べたにもかかわらず、岡部氏自身はFRP
を用いた実用的なGUIアプリを提示していない。
JavaScriptのDateは関数型プログラミングのストリームであり、.now()関数の返り値も
参照透明と主張。
関数型プログラミングと古典物理学の密接な関係
nodeのFRP(関数型リアクティブ)ライブラリ worldcomponent の後継、 worldtimestre
am の公開
JavaScriptで時間発展する物理系=私達が生活するこの宇宙の挙動を、関数型プログラミ
ングでイミュータブルに記述する、という関数型リアクティブプログラミング(FRP)の
概念実証
で説明されているので、上記2つは中傷。
末尾再帰の最適化を理解していない。
「お絵かきアプリ」と「クリックカウンター」を簡単に実装できると見せかける誤魔化し
と嘘 原理的に可能かどうか?と実用的であるかどうか?は違うが、それを「銀の弾」で
はない、という言葉をもって自らの嘘、誤魔化しの言い訳として悪用するな
で反論されているので、中傷。
また上記の起訴猶予処分の件で岡部氏は虚構癖があると理解しましたので、技術的
根拠もなく誤りを一切認めず虚構癖のある著者が執筆した『関数型プログラミング
に目覚めた! IQ145の女子高校生の先輩から受けた特訓5日間』は読むに値しない技
術書だと判断致しました。
これは誤りです。起訴された場合は刑事事件記録に掲載され「誰でも」閲覧できま
すが、不起訴記録は不開示です。(神戸地方検察庁に確認済) 如何にも尤もらし
い公文書番号を提示されていますが「誰でも追認可能な証拠」にはなりませんよ。
からそのような結論になる論旨を説明してください。数々の中傷に加え名誉毀損ですね。
公平に判断する「フリ」をして、ただ単に使えそうなネガキャンリストするだけの悪質な
手口は、
@nonstarter も @diff も一緒ですが、同一人物ですか?
「ご参考になれば幸いです。」
86Kazoo
0 contribution
Aug 07, 2015 12:32
'Thank
楽しく拝見しており、初心者としては勉強になりました。トピ主に感謝いたします。
Day4も楽しみに待っております。またいずれ見に来ます。
https://archive.is/r4i8e
74/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
Day4も楽しみに待っております。またいずれ見に来ます。
P.S. 上のコメントにある著者による宣伝のひとつである記事、
『JavaScriptで時間発展する物理系=私達が生活するこの宇宙の挙動を、関数型プログラ
ミングでイミュータブルに記述する、という関数型リアクティブプログラミング(FRP)
の概念実証』って、
よく見たら明らかに恒等式じゃないですし、そもそもその「式」が間違っていますね・・・
無論「ささいなミス」で、すぐに訂正するでしょうが、いろいろ、ミスの多い人です
ね・・・素質はあるんですが。
OmankBSD
0 contribution
Aug 08, 2015 16:54
'Thank
Day4私も楽しみです。著者の荒らし行為に負けずに頑張ってください。
totemring
0 contribution
Oct 06, 2015 08:02
'Thank
著者ブログ
timeengine / Time Engine FRP ( Functional Reactive Programming / 関数型リアクティブ
プログラミング) npmライブラリの公開
によると、
worldcomponent https://www.npmjs.com/package/worldcomponent
は、すでに、後継の timeengine https://www.npmjs.com/package/timeengine
にアップデートされています。
@nonstarter @Lambada ご両名その他の主張が誤りなのは上記ブログやライブラリ、
Demoで明確です。
Lambada
0 contribution
Oct 06, 2015 08:34
'Thank
依然として全く関数的でない、命令的副作用によるプログラムを関数型と主張してい
る(追記:例えば「 tMap 」によるループ内での this.rx と this.ry への破壊的代入
および this.forceUpdate() による更新は、不要に複雑な形で書かれていますが典型
的な命令型プログラムです 1。)
まさに参照不透明な関数の典型例である Date.now() を参照透明と主張している
メモリリークしない私のプログラムを、メモリリークすると主張している
岡部氏が要求して、nonstarter氏や私が直ちに示した「お絵かきロジック」プログラム
を岡部氏自身は4ヶ月以上も経って未だに示していない
等々、これまでに多くの人が指摘してきた著者の数多の誤りは現在も何ら修正されてませ
ん。これまでの私のコメントをご覧いただければ幸いです。
1. 本体が this.rx = x; this.ry = y; this.forceUpdate(); という破壊的代入・更新しか行わ
ない(副作用しか持たない)のですから、表面的に map を使っていようが for 文等を使っていよ
うが、まさに命令的ループです。
totemring
0 contribution
https://archive.is/r4i8e
Oct 06, 2015 08:51
'Thank
75/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
0 contribution
2015/11/05 0:41
'Thank
依然として全く関数的でない、命令的副作用によるプログラムを関数型と主張して
いる
はて?
(()!=>!{
!!'use!strict';
!!//MKS!system!of!units
!!var!V0!=!85.0;!//!m/s
!!var!DEG!=!30;!//degree
!!var!THETA!=!DEG!/!180!*!Math.PI;!//radian
!!var!G!=!9.8;!//gravity!const
!!//10msec!time!resolution
!!//t!seconds!elapsed!since!t0
!!var!t!=!__.intervalSeq(10).tMap((tt,!t0)!=>!(tt!C!t0)!/!1000);
!!var!x!=!t.tMap((t)!=>!V0!*!Math.cos(THETA)!*!t);
!!var!y!=!t.tMap((t)!=>!V0!*!Math.sin(THETA)!*!t!C!1/2!*!G!*!Math.pow(t,!2));
!!//==============================================================
!!var!Drawscale!=!4;!//4!dot!=!1!meter
!!class!ReactComponent!extends!React.Component!{
!!!!constructor()!{
!!!!!!super();
!!!!!!var!timeseq!=!__([x,!y])
!!!!!!!!.tMap(([x,!y])!=>![50!+!x!*!Drawscale,!300!C!y!*!Drawscale])
!!!!!!!!.tMap(([x,!y])!=>!{
!!!!!!!!!!this.rx!=!x;
!!!!!!!!!!this.ry!=!y;
!!!!!!!!!!this.forceUpdate();
!!!!!!!!});
!!!!}
!!!!render()!{
!!!!!!var!el!=!(
!!!!!!<div>
!!!!<h1>For!new!shot,!Just!Reload!the!browser!page</h1>
!!!!<svg!height!=!"100%"!!width!=!"100%">
!!!!!!!!<circle!r="5"!fill="blue"
!!!!!!cx!=!{this.rx}
!!!!!!cy!=!{this.ry}/>
!!!!</svg>
!!</div>
!!!!!!);
!!!!!!return!el;
!!!!};
!!}
!!var!mount!=!React.render(<ReactComponent/>,!document.body);
})();
具体的にどこですか?
「依然として全く関数的でない、命令的副作用によるプログラム」に該当する箇所を明示
していただくようおねがいします。
まさか timeengine という関数ライブラリのソースコード への文句ですか?
まさに参照不透明な関数の典型例であるDate.now()を参照透明と主張している
Date.now()は参照透明です。
現在時間(暗黙に(放っておいても自然に)変化する) Date.now()(暗黙に(放ってお
https://archive.is/r4i8e
76/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
いても自然に)変化する)
因みに、時間変化を伴うモデルは物理の文脈での数学であり、
物理学で t を現在時間とした場合、それは参照透明に現在時間です。「当然」現在時間は
変化している「ように見えます」。
メモリリークしない私のプログラムを、メモリリークすると主張している
私のほうではまったくテストしてない(する気もない)ので真偽はコメントできません。
岡部氏が要求して、nonstarter氏や私が直ちに示した「お絵かきロジック」プログラ
50%
ムを
岡部氏自身は4ヶ月以上も経って未だに示していない
「お絵かきロジック」プログラムって、timeengine / Time Engine FRP ( Functional Reacti
ve Programming / 関数型リアクティブ プログラミング) npmライブラリの公開で示され
たDemo
http://sakurafunctional.github.io/demo/react-physics/
(ソースコードは当コメント上記に添付済み)
以上のものが必要なのでしょうかね?
上記のコードにマウスクリックのイベントハンドラに入れ替えたらそのままお絵かきロジ
ックになりそうなものですが、いちいち書いてもらう必要性はどこにあるんでしょうか?
また容易に書けるということも判別できないのならば、それ以上いうことはないです。
Lambada
0 contribution
Oct 06, 2015 09:08
'Thank
すみませんが、これまでに何度も具体的に誤りを指摘されてきた岡部氏と全く同じご主張
のようですので、これまでの議論をお読みください。特に、参照透明の定義は、岡部氏と
全く同じ誤解をされているようですので、英語版Wikipedia
https://en.wikipedia.org/wiki/Referential_transparency_%28computer_science%29
や、英語版Wikipediaから参照されGoogle Scholar
https://scholar.google.com/scholar?q=referential+transparency
でもトップに来る標準的な学術論文
http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf
をご覧ください。一つ目の英語版Wikipediaの現時点での記述は(ここでの議論に関連す
る範囲では)二つ目や三つ目のような数多くの(というか確認できる限り全ての)査読付
学術論文と整合的で信頼できます。ご参考までに、例えば以下の記述があります。
today() is not transparent, as if you evaluate it and replace it by its value (say, "Jan
1, 2001"), you don't get the same result as you will if you run it tomorrow. This is
because it depends on a state (the time).
(私訳:「today()は参照透明ではありません。評価して値(例えば"Jan 1, 2001")で置き
換えると、明日に実行するのと同じ結果が得られないからです。これはtoday()が状態(時
間)に依存しているためです。」)
https://archive.is/r4i8e
77/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
逆に(時間にせよ何にせよ)プログラム上に存在しない暗黙の引数を考えれば参照透明な
どと言い出したら、状態に依存したどのような関数も参照透明になってしまい「参照透
明」という概念の存在意義がなくなってしまいますので、そのような定義があり得るとは
思いません。
追記:「ご回答よろしくお願いします」とのことですが、これまでの議論ですでに明白
な、岡部氏と全く同じ誤りを繰り返すばかりで、誠に失礼ながらいわゆる「荒らし」が目
的としか思えませんので、これ以上はご回答しかねます(他の方に有用な情報が提供でき
そうな場合はするかもしれませんが)。2ちゃんねるへの書き込みも私ではありません。
ご了承ください。
totemring
Oct 06, 2015 09:24
'Thank
0 contribution
一つ目の英語版Wikipediaの現時点での記述は、二つ目や三つ目のような多数の学術
論文と整合的で信頼できます。ご参考までに、例えば以下の記述があります。
2ちゃんねるにレスされているとおりですが、えー、Wikipediaの記載は確認しました。
英語版のWikipediaの記載を引っ張りだして恥ずかしくないのですか?
当該記事について貴方がWikiにデタラメを書いたのではない保証とかあるのでしょうか?
学術的にコンセンサスは取れている情報であると担保でもあるのでしょうか?
その整合するとされる、「多数の学術論文」とはいったいどの箇所ですか?まったく信頼
できません。なお闇雲に、
https://scholar.google.com/scholar?q=referential+transparency
このような検索リンクを貼り付けられたところで論外です。
today() is not transparent, as if you evaluate it and replace it by its value (say, "Jan
1, 2001"), you don't get the same result as you will if you run it tomorrow. This is
because it depends on a state (the time).
tomorrow という時間要素について、コードがモデル化する物理世界に数学上どのように
反映されているのですか?
まさか「無視」なんでしょうか?そういうことが論じられているわけですが。
run on "Jan 1, 2001" today
"Jan 1, 2001"
ruo on "Jan 2, 2001" tomorrow
"Jan 2, 2001"
私には「参照透明」にしか見えないですが。
標準的な学術論文ということは、誰かの学術的主張ということですね?
私が問いただしているのは、その学術論文とやらが、サイエンスのコンセンサスを得るに
至っているのか?
ということです。
あなたが、ある一定の学術論文のその主張に与しているから、それを都合よく参照したか
https://archive.is/r4i8e
78/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
らといって、正しいとはなりません。
はて、私が「仮に」真逆の主張、著者の主張と同調する内容の論文でも発表すれば、自動
的にそれが正しくなるのですかね?
totemring
0 contribution
Oct 06, 2015 10:13
'Thank
Wikipedia英語版に「書きなぐられた」主張と整合するとされる、信頼できるらしい「標
準的な学術論文」
http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf
をざっと見ましたが、
today() is not transparent, as if you evaluate it and replace it by its value (say, "Jan
1, 2001"), you don't get the same result as you will if you run it tomorrow. This is
because it depends on a state (the time).
と整合する箇所についての論述がいったいどこに書かれているのか判別できませんでし
た。
多くのビューワーも同じでしょう。補足していただけませんか?
闇雲に、
https://scholar.google.com/scholar?q=referential+transparency
このように無責任な資料の投げ捨てはぜひ止めていただきたいのですが、相手をケムに巻
きたいだけなのでしょうか?
いったいどこに @Lambada のいうところの「信頼」の源泉を見い出せば良いのか当方
にはまったくわかりかねます。
逆に、プログラム上に存在しない暗黙の引数を考えれば参照透明などと言い出した
ら、状態に依存したどのような関数も参照透明になってしまい「参照透明」という
概念の存在意義がなくなってしまいますので、そのような定義があり得るとは思い
ません。
著者(および私)が主張しているのは、時間要素に限定しており、
@Lambadaが引用したフレーズにおいても、 tomorrow をはじめとする時間要素に限定さ
れ、それについて論じているのです。
誰も、任意の状態についてどのような関数にでも、という話などしておりませんし、「参
照透明」について、現実世界のモデル化において、時間要素を「数学的に」無視している
のは何故か?という確認をしているに過ぎません。
議論を歪曲なさらないようにお願いいたします。
totemring
0 contribution
Oct 06, 2015 10:47
'Thank
上記案件について、@Lambada らしき人物が、著者を個人攻撃する2チャンネルスレッド
でレスしていたので、該当箇所を引用します。
7!:仕様書無しさん:2015/10/06(火)!09:51:29.03
当たり前だけど念のため、岡部の理論は100%完全にデタラメ。!
そもそも岡部以外にDate.now()が参照透明なんて言ってる奴は世界中に誰もいないが、!
https://archive.is/r4i8e
79/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
そもそも岡部以外にDate.now()が参照透明なんて言ってる奴は世界中に誰もいないが、!
英語版Wikipediaも間違ってるとか言い出したから一応、専門の研究者に広く受け入れられている厳密な
定義は!
論文!http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf!の第4節(p.511)
な。!
当然、Date.now()やtoday()は参照透過でない。
43!:仕様書無しさん:2015/10/06(火)!10:39:42.99
>>30!
>Date.now()が参照透明<じゃない>っていうのがまったく繋がらないんだけど、どうなってんのこれ?!!
本気で言ってるのwwww?!
Date.nowの引数(空集合φ)についてφ=φが成立するのに!
Date.now(φ)とDate.now(φ)の値が異なってしまうので!
Date.nowが(0番めの)引数についてpurely!referentialでなく、!
それゆえreferentially!transparentでない、ということすら!
この定義から読み取れないようなそんな学力でグダグダ抜かしてるわけwwww?!
50!:仕様書無しさん:2015/10/06(火)!10:49:41.62
>>46!
>それ、現実の物理世界の時間はどう数学的に反映されてんの?ってQiitaでつっこまれてること!
>繰り返してるだけだろ?!
意味不明なんですけど。!
あるexpressionにreferential!transparencyを保ちつつ時間に対応して!
異なった値を取らせたければ時間を表す引数がなければならないし、!
それがないならばreferentially!opaqueになるというだけのことなんだが。!
61!:仕様書無しさん:2015/10/06(火)!11:03:17.58
>>54!
>「現在時間」を「時間を表す引数」として表すのはどうすんの?!
>つまりDate.now()の引数がカラだって文句垂れてるわけだが、!
>これの、「現在時間」を「時間を表す引数」をわたす表記をおせーてよ!
「表記」ねえ。この時点でもうなんにも理解できてないのがわかるんだが……!
引数を追加するのは!
Date.now(a1)!
のようにしてやればいいだけだ。!
この引数位置の引数が時間を表すかどうかはsemanticsの問題で、syntaxの問題じゃない。!
なお、上記は、当方の問いかけ
tomorrow という時間要素について、コードがモデル化する物理世界に数学上どのよ
うに反映されているのですか?
まさか「無視」なんでしょうか?そういうことが論じられているわけですが。
run on "Jan 1, 2001" today
"Jan 1, 2001"
ruo on "Jan 2, 2001" tomorrow
"Jan 2, 2001"
私には「参照透明」にしか見えないですが。
についての回答としてまるで成立していないことは説明は不要でしょう。
現実世界のモデル化において、時間要素を「数学的に」無視しているのは何故か?
という確認をしているに過ぎません。
という論点において、ユーザが現実世界において、 today や tommorow という「差異」を
生じさせている現象を伴いながら、コードをrunnningさせる時間要素については、上記2
ちゃんねるレスの数学的説明にはまったく考慮されていないことを申し上げています。
【追記】
@Lambada とおぼしき人物が2ちゃんねるで主張するには、
https://archive.is/r4i8e
80/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
@Lambada とおぼしき人物が2ちゃんねるで主張するには、
92!:仕様書無しさん:2015/10/06(火)!11:47:58.55
Date.now()!(==t1)!
Date.now()!(==t2)!
(sub)expressionが同じなのに値が異なる。!
Sondergaard&Sestoft!1990,!p.!511の定義に従って、!
expression!"Date.now()"!は参照透明でない。!Q.E.D.!
ということらしいです。(呆れ)
Date.now()!(==t1)!
Date.now()!(==t2)!
というのは、関数型・宣言型のコードではありえず、
宣言型であるのならば、当然
Date.now()!(==t1)!
Date.now()!(==t1)!
と(理論上)「同時」に評価されます。宣言型のコードには上下関係と時間軸の関係は
(理論上)ないので(今更ですが、基本ですよね)。
@Lambada とおぼしき人物が著者を個人攻撃する2ちゃんねるでレスしたコード
Date.now()!(==t1)!
Date.now()!(==t2)!
となるのは、このコードが宣言型でなく、コードの上下方向にフローする命令型のコード
の場合です。
つまり時刻 t1 から時刻 t2 と時間遷移する時系列で、コードを上下順に評価していった場
合、
時刻(t1)!Date.now()!(==t1)!
時刻(t2)!Date.now()!(==t2)!
となります。繰り返しですが、これは命令型のコードです。
この場合、
時刻(t1)において、 Date.now() を評価するのだから、返り値は(==t1)
時刻(t2)において、 Date.now() を評価するのだから、返り値は(==t2)
となって当然であり、論理整合に矛盾はありません(あたりまえ)
これをもって著者(や私)は、
Date.now()は「暗黙」に参照透過である、と論じています。
そしてもちろん、@Lambada とおぼしき人物が2ちゃんねるで主張する
92!:仕様書無しさん:2015/10/06(火)!11:47:58.55
Date.now()!(==t1)!
Date.now()!(==t2)!
(sub)expressionが同じなのに値が異なる。!
https://archive.is/r4i8e
81/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
Sondergaard&Sestoft!1990,!p.!511の定義に従って、!
expression!"Date.now()"!は参照透明でない。!Q.E.D.!
というのは、明確に間違いです。
ここには一切、
時刻t1,t2の差異は数学的に明示しないまま、その差異を一切合切無視して、すべての時間
軸の物理世界において、
"Date.now()"が同じ値を返すのが参照透明、という誤った論証が展開されています。
Date.now()という関数は、ユーザの現実世界の現在時間依存の関数であり、
それぞれの時刻、つまりここでいう、t1,t2において参照透明です。
Q_Jirou
0 contribution
Oct 06, 2015 13:42
'Thank
以前にも、いきなり2ちゃんねるの書き込みがどうだとかで、こちらの方に因縁付けてる
方が居ましたけど、そういうの、やめませんか?
「らしき人」ってなんですか?
それをこちらで返答するのはお行儀が悪いですよ。
totemring
0 contribution
Oct 06, 2015 14:53
'Thank
こちらの投稿について、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-18cef754dda276e9b
10c
すみませんが、これまでに何度も具体的に誤りを指摘されてきた岡部氏と全く同じ
ご主張のようですので、これまでの議論をお読みください。特に、参照透明の定義
は、岡部氏と全く同じ誤解をされているようですので、
https://en.wikipedia.org/wiki/Referential_transparency_%28computer_science%29
や、標準的な学術論文
http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf (特に第4
節)
https://scholar.google.com/scholar?q=referential+transparency
をご覧ください。
文脈そのままで、
7!:仕様書無しさん:2015/10/06(火)!09:51:29.03
当たり前だけど念のため、岡部の理論は100%完全にデタラメ。!
そもそも岡部以外にDate.now()が参照透明なんて言ってる奴は世界中に誰もいないが、!
英語版Wikipediaも間違ってるとか言い出したから一応、専門の研究者に広く受け入れられている厳密な
定義は!
論文!http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf!の第4節(p.511)
な。!
当然、Date.now()やtoday()は参照透過でない。
Sondergaard&Sestoft!1990,!p.!511の定義に従って、!
expression!"Date.now()"!は参照透明でない。!Q.E.D.!
だの2ちゃんねるでレスしたのは当方でなく、 @Lambada とおぼしき人物ですが。
https://archive.is/r4i8e
82/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
あと、
http://kanae.2ch.net/test/read.cgi/prog/1440252315/
このスレで、
Q次郎 ◆h6EC5BK7zm2wで検索かけてみると、著者をあげつらうような下劣なAAを投稿
していたり、
57!:Q次郎!◆h6EC5BK7zm2w!:2015/08/24(月)!08:30:07.02
もうおしまいですか?口ほどにでもない!
58!:Q次郎!◆h6EC5BK7zm2w!:2015/08/24(月)!08:31:14.01
クソホモの分際で吠えるからこうなるんですよ!
だの、どの口で、「お行儀が悪い」とか言ってるのかわかりませんが。あざといですよ
ね。
ああ、白々しい言い訳はよく見ますし、白々しい否定につきあうつもりもありません。
個人の感想、印象だってことでいいですよ。
あとは、Q次郎 ◆h6EC5BK7zm2w いや失礼、@Q_Jirou そして @Lambada それか
ら、 @nonstarter その他、
すでに書いたとおり、下劣なAA投下をはじめする手段を選ばない著者を中傷 謗する2
ちゃんスレと連携しながら、あたかも中立なレビューを装って読者の印象操作を繰り返す
という、あなたがたの卑劣なやり口について、読者諸氏が広くどのような印象を抱かれる
か自由な判断に委ねたいとおもっています。それでは。
Q_Jirou
0 contribution
Oct 06, 2015 16:02
'Thank
以前もそっくりな因縁を付けられたことがあるのですが、あなたはその人とは別の人です
か?
私は2ちゃんねるには書いてません。
totemring
0 contribution
Oct 06, 2015 16:25
'Thank
はいはい、了解しましたー。
参考情報ですが、この記事に出現してコメントしている、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-0591f0a691296bc00
444
@BeastTadokoro においても、
土曜・日曜は岡部健のブログを読み解こう!★8![転載禁止]©2ch.net
1!:BeastTadokoro:2015/10/06(火)!09:37:02.86
恒等式は「ささいな記述ミス」であることが判明。!
Qiitaに再び降臨、3つのシリアルアカウントを駆使するも運営にBANされた!
孤高のコーダー、毛の壁。!
http://kenokabeCtechwriting.blogspot.jp!
そんな毛の壁氏の、独自用語・独自解釈について皆で解明していきましょう!
2!:BeastTadokoro:2015/10/06(火)!09:37:55.20
ご自由にお使いください!
{著者のSNS写真をAA化したとみられる下劣なAA}
からはじまり、
https://archive.is/r4i8e
83/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
57!:BeastTadokoro:2015/10/06(火)!10:58:47.81
おいハッタリヌケサクよ?!
こんな所で油売ってていいのか?!
58!:BeastTadokoro:2015/10/06(火)!11:00:22.70
おら、オトシマエどうつけんだ?!
民事も刑事も、一切何も無し(笑い)!
失敗に終わったら「無かったこと」か?ひれつ野郎!
62!:BeastTadokoro:2015/10/06(火)!11:04:08.82
>>54!
おら、小汚い尻穴売ることでしか金を稼げないキチガイよ。!
さっさと訴えろや?(笑い)随分と難航してるんだな?!
63!:BeastTadokoro:2015/10/06(火)!11:05:36.25
>>54!
貴様は諦めたんだろうが、俺は一生つきあうぞ。!
ずっとだ。ずっといじめてやるぜ!
などと、延々と粘着、中傷
謗が書き連ねられています。
一体なにが起こっているのか、容易に判別可能な状況です。
このような状況下において、同スレッドに頻出する
Q次郎 ◆h6EC5BK7zm2w という固定ハンドルの
謗中傷犯と上記白々しい態度を取り
続けている @Q_Jirou という一致について「因縁」だと私自身はまったく考えておりませ
んし、そもそもこの記事においてこの、@Q_Jirou によるコメントには一切の技術的言及
は存在せず(すべてあざとい茶々入れに終始しています)、いったいこの人物は何が目的
でこんなところに出没しているのか??存在理由が私も読者も誰一人意味がわからないわ
けですが、個人の感想、印象だってことでいいですよ。白々しい言い訳はよく見ますし、
白々しい否定につきあうつもりもありません。
当まとめ記事が、
『関数型プログラミングに目覚めた!』のレビュー(Day-1)
である以上、その言説を展開する人間がいかなる姿勢、スタンスで「論評」しているの
か?
前述の通り、 @Lambada と見られる人間が、まったく同内容をもって、当該2ちゃんね
るスレッドに書き込みしている事実、その内容自体も読者の参考になるでしょうし、非常
に胡散臭いバイアス(控えめに言ってバイアス、はっきりいって悪意に基づく不公正かつ
極端なネガティブキャンペーン)であると私個人の印象がありますが、卑劣なやり口につ
いて、読者諸氏が広くどのような印象を抱かれるか自由な判断に委ねたいとおもっていま
す。
以上、公正な判断に役に立つ参考になる情報だと思います。
Lambada
0 contribution
Oct 06, 2015 17:01
'Thank
先のコメントにも追記しましたが、totemringさんが挙げている2チャンネルへの書き込み
はすべて、断じて私ではありません。ご自身の憶測のみによる、事実ではないご主張で、
非常に不快かつ迷惑です。同じ文献や同じ表現が出てくるのは、それらがまさに標準的
で、ちょっと調べれば同じものが出てくるからです。ましてや私がここでコメントした後
に、別のところで同じことを書く方がいても、それが客観的事実である以上、何ら不思議
ではないと思います。ひょっとしたらQiitaからの更新通知等で私のコメントをご覧になっ
たのかもしれませんし、そうでなくても「1+1=2」は誰が書いても「1+1=2」になるのと
同じことです。
https://archive.is/r4i8e
84/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
同じことです。
P.S. 下のほうでtotemring氏が参照されているReddy氏のコメントは私が挙げたような査読
論文ではありませんが、氏が述べている参照透明性は、私が挙げた査読論文の定義と一致
します1。また、氏が挙げているQuineやStrachyの論文を見ても、大まかに言うと「文の
一部をその値(参照する対象)で置き換えても全体の意味は変わらない」という、私や
nonstarter氏が用いている参照透明性の定義と一致します。
なお、totemring氏は私が言を変えたかのように主張されているので、当たり前ですが念の
ため、Reddy氏が論じている命令型言語と異なり、純粋な関数型言語や数式はまさに「状
態」や「暗黙の引数」がないため、「1+2=3」のように言語内でも式の値を表せます。岡
部氏やtotemring氏(およびすでにアカウントを取り消された同様の方々)は「x=x+1;」
のような命令型プログラムを(ご自身では理解されていないかもしれませんが)純粋な数
式や関数型言語の意味論にもとづいて「論理破綻」と批判し、関数型プログラミングの話
をしていたのではなかったのでしょうか。まさに関数型言語の意味論でDate.now()が参照
透明にならないから「Date.now()==Date.now()」が一般には成り立たない、という「論理
破綻」は良いのでしょうか。誠に失礼ながらtotemring氏は(すでにQiitaや他のサービス
で多数のアカウントを停止された)本書の著者である岡部氏と全く同様に、明らかに各種
文献や研究の具体的内容を理解せず表面的な文言ばかり取り上げ、私や他の方を否定しご
自分の主張を正当化するためだけに、技術的にも論理的にもメチャクチャな、異常な量の
投稿を繰り返しておられます。そのような投稿は非常に迷惑ですし、ご自分で勉強するど
ころか、そもそも理解する意思もお持ちでない氏に対して、私が関数型言語や命令型言語
の意味論の基本をご説明する義務があるとも思いません。また、最初に述べたことの繰り
返しになりますが、totemring氏が引用している2チャンネルの投稿は断じて私ではありま
せん。まさに事実無根の
謗中傷です。
1. 論文 http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf 511ページにある参照透
明(purely referential)の定義e1 = e2
e[e1/p] = e[e2/p]における=は、510ページで表示的意味
(denotational semantics) Dにより定義されているので、まさにReddy氏の言う言語の外の表示
(denotation)です(実際、この論文の対象言語の表示的意味は集合で定義されている一方、言語自体
の中に集合の式の構文はありません)。そして、この論文でも他の研究でもそうですが、純粋な関
数型言語の表示的意味に「現在時刻」や「状態」のような「暗黙の引数」は存在しません2。なお、
同じ論文の第1章では、Reddy氏と同じくQuineの議論を忠実に追った上で、Reddy氏と同様に
Stracheyの理論を詳しく説明しています(この論文は1990年に発表されています)。
2. プログラム上も陽である「変数束縛」を表す「環境」はありますが、これは単一代入で、「現在時
刻」や「状態」のように値が変化したりしません。純粋でない関数型言語や命令型言語ならば「状
態」が存在しますが、それは岡部氏が著書で強く批判している「x=x+1;」等と同じです 3。
3. 純粋な関数型言語のプログラム上でモナドを使うことはできますが、あくまで純関数的な言語の中
ですので、その意味論にモナドは不要で、「状態」や「暗黙の引数」はありませんし、逆に「状
態」を持つ命令型言語の意味論にモナドを用いることもできますが、その二つは同じ「モナド」の
概念を利用していても別の話です 4。
4. 前者の場合、純粋な言語で表された関数等を、言語の外部の処理系が実際の「現在時刻」等に適用
して実行しますので、純粋でない言語と異なり、言語自体やその上のプログラム(あるいはそれら
の意味論)に「状態」や「暗黙の引数」は存在せず、副作用がない数式のように扱うことが可能と
なります。例えば整数を返すJavaScriptのDate.now()と異なり、HaskellのgetCurrentTimeは、整数
や特定の時刻を表す文字列等を返す関数ではなく、IOアクションです(後者は関数ですらなく、単
なる一つの値であることに注意してください)。そのIOアクションは特定の時刻を表す整数等 では
なく、「現在時刻を取得する」という動作を表す値に過ぎませんので、それ自体は副作用も「暗黙
の引数」もなく、時刻によって値が変わったりはしません。これは確かに初学者が混乱しやすいと
ころで、インターネット上でも混乱した議論はありますが、Haskell等の純粋な言語でモナドを用い
て副作用を表すことを提案したWadler氏(Reddy氏も言及していますね)のチュートリアル論文等
https://archive.is/r4i8e
85/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
でも最初から強調されている、基本中の基本です(IOアクションが「動作を表す値」に過ぎないこ
とを理解していないと、第一級値としてリストの要素や関数の引数や戻り値になりうることが理解
できません)。
totemring
0 contribution
Oct 06, 2015 17:27
'Thank
先のコメントにも追記しましたが、totemringさんが挙げている2チャンネルへの書
き込みはすべて、断じて私ではありません。ご自身の憶測のみによる、事実ではな
いご主張で、非常に不快かつ迷惑です。(同じ文献や同じ表現が出てくるのは、そ
れらがまさに標準的で、ちょっと調べれば同じものが出てくるからです。ましてや
私がここでコメントした後に、別のところで同じことを書く方がいても、それが客
観的事実である以上、何ら不思議ではないと思います。ひょっとしたらQiitaからの
更新通知等で私のコメントをご覧になったのかもしれませんし、そうでなくても
「1+1=2」は誰が書いても「1+1=2」になるのと同じことです。)
あ、ちなみに、著者を執拗に個人攻撃することを目的とした2ちゃんねる中傷
謗
スレで、本日最初の@Lambadaのコメントに酷似している、こんなレスもありまし
た。
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-a4b82c4ea1870360e
2b9
・依然として全く関数的でない、命令的副作用によるプログラムを関数型と主張し
ている
上記この記事のコメントは、Oct 06, 2015 08:34になされ、
以下の2ちゃんレスは、2015/10/06(火) 08:40:46.92
いやはや、内容が酷似しているのみでなく、時間もたった数分の違いですねえ。
この記事にコメントした勢いそのまま、すぐさま「いつもの」2chスレッドを開いて、思
いの丈をぶつけたのでしょうか?
960!:仕様書無しさん:2015/10/06(火)!08:40:46.92
timeengineも副作用バリバリの命令型プログラム。!
worldcomponentよりさらにスパゲッティになっただけで、!
関数型でも何でもない。関数型の定義から読み直してね。!
https://en.wikipedia.org/wiki/Functional_programming!
pS.「関数型でない」というのが客観的事実という、 @Lambada による無理筋の客観性
のない主張ですが、
すでに、http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-6bd8f7e03c
76699bfcee
にて、ソースコートを明示してどこが関数型でないのか?問いただしましたが、回答でき
ないようです。
どうせ、関数型ライブラリ(JavaScriptでは多くの関数型言語の実装レイヤに匹敵する)
のソースコードについてあいかわらず、「スパゲッティ・コード」だの適当な中傷罵倒を
しているのでしょうが、まったく意味のない言い分です。
@Lambadaが著者のコードを貶すときに愛用する語句「スパゲッティ」というのも添え
て、
https://archive.is/r4i8e
86/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
て、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-7d7a978d53ad17b91
1c5
(無駄に複雑なスパゲッティ・プログラムですが、よく読むと要するに
state = state + 1; と同じ破壊的代入です。)
同じく英語版Wikipediaの「定義」の引用もありますし、「酷似してるなあ」と思います
が、
例のデザイナのエンブレムの騒動のように「酷似している」というのはたしかに印象の域
を出ませんよね。
だから個人の感想、印象だってことでいいですよ。あとは読者の判断に委ねましょうよ。
貴方に私の印象を押し付けることはできないでしょうし、そのつもりはありません。
繰り返しになりますが、白々しい言い訳はよく見ますし、白々しい否定につきあうつもり
もありません。
個人の感想、印象だってことでいいですよ。
平気で「嘘」をつく人なんだ、と思われるのはたしかに迷惑ですよね。しかしこういうレ
ビュー対象の著者を貶めるために一生懸命あざとい「嘘」つく人は、果たして公平なレビ
ュアとして機能するのか?というのは論をまたないことでもあります。
以上参考になる情報だと思います。
PS.
別のところで同じことを書く方がいても、それが客観的事実である以上、何ら不思
議ではないと思います。ひょっとしたら私のコメントをご覧になったのかもしれま
せんし、そうでなくても「1+1=2」は誰が書いても「1+1=2」になるのと同じこと
です。
について、また全く同一内容がレスされたようです。
324!:仕様書無しさん:2015/10/06(火)!19:49:49.24
正当な技術的批判を 謗中傷ということにしたい誰かさん必死だな!
でも残念ながら数学と一緒で、どんなに印象操作しようとしても!
論理によって演繹的に証明される客観的事実は変わらないから。
Q_Jirou
0 contribution
Oct 06, 2015 18:04
'Thank
迷惑行為も同然なのでやめてください。
一度だけ苦言を呈しておきます。
totemring
0 contribution
Oct 06, 2015 18:07
'Thank
私はむしろ、貴方がたが「迷惑行為」をやめるべきだと以前から思っていますがね。
一度だけ苦言、というのはどういう意味なんでしょうか?
私は @Q_Jirou なる人物がこのまとめ記事で建設的な技術面でのコメントをしているのを
https://archive.is/r4i8e
87/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
見たことが一度もありませんし、もうコメントをしないってことなら歓迎します。
OmankBSD
Oct 06, 2015 20:08
'Thank
0 contribution
totemringさんは以前、ここでアカウントを凍結された人ですか?
「以前から思っています」とありますが、ずっと観察されていた方ですか?
あるいは、あなたは岡部健さんでしょうか?別の人でしょうか?
totemring
Oct 07, 2015 03:45
'Thank
0 contribution
なお、繰り返し念の為ですが、
そもそもこの記事においてこの、@BeastTadokoroは、同じく2ちゃんスレの 謗中傷犯
の固定ハンドルと一致する@Q_Jirou同様、コメントには一切の技術的言及は存在せず(す
べてあざとい茶々入れに終始しています)、いったいこの人物は何が目的でこんなところ
に出没しているのか??存在理由が私も読者も誰一人意味がわからないわけですが、個人
の感想、印象だってことでいいですよ。白々しい言い訳はよく見ますし、白々しい否定に
つきあうつもりもありません。
つきあうつもりは一切ありませんが、物事の順序としては、
@BeastTadokoroは、他人や私のことを
索する以前に、まず、以下の重大なことについ
て当人として然るべき説明があるのが筋だと思いますが。
参考情報ですが、この記事に出現してコメントしている、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-0591f0a691296bc00
444
@BeastTadokoro においても、
土曜・日曜は岡部健のブログを読み解こう!★8![転載禁止]©2ch.net
1!:BeastTadokoro:2015/10/06(火)!09:37:02.86
恒等式は「ささいな記述ミス」であることが判明。!
Qiitaに再び降臨、3つのシリアルアカウントを駆使するも運営にBANされた!
孤高のコーダー、毛の壁。!
http://kenokabeCtechwriting.blogspot.jp!
そんな毛の壁氏の、独自用語・独自解釈について皆で解明していきましょう!
2!:BeastTadokoro:2015/10/06(火)!09:37:55.20
ご自由にお使いください!
{著者のSNS写真をAA化したとみられる下劣なAA}
からはじまり、
57!:BeastTadokoro:2015/10/06(火)!10:58:47.81
おいハッタリヌケサクよ?!
こんな所で油売ってていいのか?!
58!:BeastTadokoro:2015/10/06(火)!11:00:22.70
おら、オトシマエどうつけんだ?!
民事も刑事も、一切何も無し(笑い)!
失敗に終わったら「無かったこと」か?ひれつ野郎!
62!:BeastTadokoro:2015/10/06(火)!11:04:08.82
>>54!
おら、小汚い尻穴売ることでしか金を稼げないキチガイよ。!
さっさと訴えろや?(笑い)随分と難航してるんだな?!
https://archive.is/r4i8e
88/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
63!:BeastTadokoro:2015/10/06(火)!11:05:36.25
>>54!
貴様は諦めたんだろうが、俺は一生つきあうぞ。!
ずっとだ。ずっといじめてやるぜ!
などと、延々と粘着、中傷
謗が書き連ねられています。
一体なにが起こっているのか、容易に判別可能な状況です。
上記
@BeastTadokoro Oct 06, 2015 20:08
同じく「ヌケサク」「(笑い)」「俺はいつでもかまわんから、何年でも待っててやるぜ
」など独特徴的なレスが、また数分後に、同じ2ちゃんスレに書き込まれています。
331!:仕様書無しさん:2015/10/06(火)!20:12:32.99
>>328!
ぎゃっはっはっはっは、白旗揚げるとは成長したじゃないか、ヌケサク(笑い)!
俺はいつでもかまわんから、何年でも待っててやるぜ!
totemring
0 contribution
Oct 07, 2015 05:25
'Thank
@Lambada にしても、懲りずに、また、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-8f454373d806047c7
a5e
で、
別のところで同じことを書く方がいても、それが客観的事実である以上、何ら不思
議ではないと思います。ひょっとしたら私のコメントをご覧になったのかもしれま
せんし、そうでなくても「1+1=2」は誰が書いても「1+1=2」になるのと同じこと
です。
などと自身のコメントに言い訳がましい(そしてあざとく、苦しい)追記をした後、また
当該2チャンネルスレに全く同一内容がレスされたようです。
324!:仕様書無しさん:2015/10/06(火)!19:49:49.24
正当な技術的批判を 謗中傷ということにしたい誰かさん必死だな!
でも残念ながら数学と一緒で、どんなに印象操作しようとしても!
論理によって演繹的に証明される客観的事実は変わらないから。
この人物が言う「客観的事実」について、繰り返しとなりますが、http://qiita.com/nonsta
rter/items/2763f5d85f2b8df3b18b#comment-6bd8f7e03c76699bfcee
にて、ソースコートを明示してどこが関数型でないのか?問いただしましたが、回答でき
ないようです。
どうせ、関数型ライブラリ(JavaScriptでは多くの関数型言語の実装レイヤに匹敵する)
のソースコードについてあいかわらず、「スパゲッティ・コード」だの適当な中傷罵倒を
しているのでしょうが、まったく意味のない言い分です。
https://archive.is/r4i8e
89/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
このように、著者を個人攻撃することを目的とした2ちゃんスレに、幼稚かつ下劣なAAを
連投することをはじめ手段を選ばない卑劣な中傷
謗行為と渾然一体となって、 @Lamba
da あるいはこの記事を起こした @nonstarter はあからさまなネガティブキャンペーンを
展開しており、この記事単独で追認できる内容に限定したとしても、 @Lambada が執
拗に使用する「スパゲッティ・コード」という中傷語句は「客観的事実」ではありませ
ん。
著者がこの記事で言及されていた worldcomponent の後継の timeeinge というFRP関数ラ
イブラリ
timeengine / Time Engine FRP ( Functional Reactive Programming / 関数型リアクティブ
プログラミング) npmライブラリの公開
に提示されているコードは、以下のようなものです。
(()!=>!{
!!'use!strict';
!!//MKS!system!of!units
!!var!V0!=!85.0;!//!m/s
!!var!DEG!=!30;!//degree
!!var!THETA!=!DEG!/!180!*!Math.PI;!//radian
!!var!G!=!9.8;!//gravity!const
!!//10msec!time!resolution
!!//t!seconds!elapsed!since!t0
!!var!t!=!__.intervalSeq(10).tMap((tt,!t0)!=>!(tt!C!t0)!/!1000);
!!var!x!=!t.tMap((t)!=>!V0!*!Math.cos(THETA)!*!t);
!!var!y!=!t.tMap((t)!=>!V0!*!Math.sin(THETA)!*!t!C!1/2!*!G!*!Math.pow(t,!2));
!!//==============================================================
!!var!Drawscale!=!4;!//4!dot!=!1!meter
!!class!ReactComponent!extends!React.Component!{
!!!!constructor()!{
!!!!!!super();
!!!!!!var!timeseq!=!__([x,!y])
!!!!!!!!.tMap(([x,!y])!=>![50!+!x!*!Drawscale,!300!C!y!*!Drawscale])
!!!!!!!!.tMap(([x,!y])!=>!{
!!!!!!!!!!this.rx!=!x;
!!!!!!!!!!this.ry!=!y;
!!!!!!!!!!this.forceUpdate();
!!!!!!!!});
!!!!}
!!!!render()!{
!!!!!!var!el!=!(
!!!!!!<div>
!!!!<h1>For!new!shot,!Just!Reload!the!browser!page</h1>
!!!!<svg!height!=!"100%"!!width!=!"100%">
!!!!!!!!<circle!r="5"!fill="blue"
!!!!!!cx!=!{this.rx}
!!!!!!cy!=!{this.ry}/>
!!!!</svg>
!!</div>
!!!!!!);
!!!!!!return!el;
!!!!};
!!}
!!var!mount!=!React.render(<ReactComponent/>,!document.body);
})();
@Lambada が執拗に繰り返す、
https://archive.is/r4i8e
90/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
・依然として全く関数的でない、命令的副作用によるプログラムを関数型と主張し
ている
(追記:例えば「tMap」によるループ内でのthis.rxとthis.ryへの破壊的代入および
this.forceUpdate()による更新は、不要に複雑な形で書かれていますが典型的な命令
型プログラムです)
あるいは、「スパゲッティ・コード」、また「不要に複雑な形で書かれていますが典型的
な命令型プログラム」という「客観的事実」なるものは、誰でも確認して、その真偽が確
認できます。
「tMap」によるループ内という言い草ひとつをとっても「スパゲッティ・コード」同
様、何故この人物は、いつもわざわざ悪意のある印象操作に固執してるのでしょうか
ね??
JavaScriptのあらゆる関数ライブラリ、ReactにしてもUnderscoreにしても、あるいは
JavaScript自身の実装にしても、HaskellであってもOCamlであっても、同じレイヤで
「map」によるループ内と言及すれば、概念的に、わざわざコンパイラの命令型による実
装に引き戻す無意味で妙ちきりんな言い分ではあるが、実装自体はそのとおりなので、し
ぶしぶそれは公正公平な「客観的事実」である、と誰しもが認めるでしょう。
しかし、@Lambadaのあらゆる言及は、上記の一端であってさえ、公正公平な「客観的事
実」とは断じて認められません。
また、関数型言語の実装レイヤに相当するJavaScriptの関数型ライブラリのソースコード
については、GitHubで公開されているので誰でも確認できます。
https://github.com/kenokabe/timeengine/blob/master/timeengine.jsx
関数ライブラリのレイヤまで降りると百歩ゆずって検証しても、
以下のソースコードにはどこにも、 @Lambadaがいう「「tMap」によるループ」など存
在しないことは誰しもが「客観的事実」として認めるところでしょう。
(()!=>!{
!!'use!strict';
!!var!log;
!!if!(typeof!module!!==!'undefined'!&&!module.exports)!{
!!!!var!util!=!require('util');!//debug
!!!!log!=!(obj)!=>!{
!!!!!!//!!console.info(util.inspect(obj,!false,!null));
!!!!};
!!}!else!{
!!!!log!=!(obj)!=>!{
!!!!!!//!!!!console.info(obj);
!!!!};
!!}
!!//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!!var!seqID!=!()!=>!{
!!!!var!id!=!0;
!!!!var!getID!=!()!=>!{
!!!!!!return!id++;
!!!!};
!!!!return!getID;
!!};
!!var!getID!=!seqID();
!!//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!!//__([a,b],!true)!!!!!true!as!store
https://archive.is/r4i8e
91/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
!!var!timeseq!=!(...args)!=>!{
!!!!if!(Array.isArray(args[0]))!{
!!!!!!var!ds!=!args[0];
!!!!!!var!store!=!args[1];
!!!!!!var!seq1!=!seq(store);
!!!!!!//ds!and!us
!!!!!!ds.map((d)!=>!{
!!!!!!!!//!!seq1.ds!=!ds;
!!!!!!!!seq1.ds[d.id]!=!d;
!!!!!!!!seq1.dsIsUpdated[d.id]!=!false;
!!!!!!!!//!add!self!seq!as!the!u!to!d
!!!!!!!!d.us[seq1.id]!=!seq1;
!!!!!!});
!!!!!!seq1.eq!=!(xx)!=>!{
!!!!!!!!log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
!!!!!!!!log(xx);
!!!!!!!!return!ds.map((seq)!=>!seq.t);
!!!!!!};
!!!!!!log('########__([x])###########');
!!!!!!log({
!!!!!!!!seq1
!!!!!!});
!!!!!!return!seq1;
!!!!}!else!{
!!!!!!var!seq1!=!seq(args[0]);
60%
!!!!!!log({
!!!!!!!!seq1
!!!!!!});
!!!!!!return!seq1;
!!!!}
!!};
!!Object.defineProperties(timeseq,
!!!!{
!!!!!!t:!{
!!!!!!!!get()!{
!!!!!!!!!!return!Date.now();
!!!!!!!!},
!!!!!!!!set(f)!{
!!!!!!!!!!f();
!!!!!!!!}
!!!!!!}
!!!!});
!!timeseq.log!=!(...args)!=>!{
!!!!var!f!=!()!=>!{
!!!!!!console.info.apply(console,!args);
!!!!!!return!args;
!!!!};
!!!!return!f;
!!};
!!timeseq.wrap!=!(legacyF)!=>!{
!!!!var!f!=!(...args)!=>!{
!!!!!!var!wrappedF!=!()!=>!{
!!!!!!!!legacyF(...args);
!!!!!!};
!!!!!!return!wrappedF;
!!!!};
!!!!return!f;
!!};
!!timeseq.intervalSeq!=!(interval,!store)!=>!{
!!!!var!seq!=!timeseq.seq(store);
!!!!//seq.intervalSeq!=!true;
!!!!var!f!=!()!=>!{
!!!!!!seq.t!=!Date.now();
!!!!};
https://archive.is/r4i8e
92/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
!!!!};
!!!!setInterval(f,!interval);
!!!!return!seq;
!!};
!!timeseq.timeoutSeq!=!(interval,!store)!=>!{
!!!!var!seq!=!timeseq.seq(store);
!!!!//seq.timeoutSeq!=!true;
!!!!var!f!=!()!=>!{
!!!!!!seq.t!=!Date.now();
!!!!};
!!!!setTimeout(f,!interval);
!!!!return!seq;
!!};
!!//CCCCCCCCCCCCCCCCCC
!!//CCCCCCCC
!!var!seq!=!(store)!=>!{!//!return!new!seq
!!!!var!seq!=![];!//seq!is!vanilla!JS!array!+!features
!!!!var!valOnT;
!!!!seq.id!=!getID();
!!!!seq.store!=!store;
!!!!//CCCCCCCCCCCCCCCCC
!!!!seq.tMap!=!(f)!=>!{
!!!!!!var!seq1!=!timeseq.seq(seq.store);!//!new!with!leftCstore
!!!!!!//ds!and!us
!!!!!!//!!seq1.ds!=!ds;
!!!!!!seq1.ds[seq.id]!=!seq;
!!!!!!seq1.dsIsUpdated[seq.id]!=!false;
!!!!!!//!add!self!seq!as!the!u!to!d
!!!!!!seq.us[seq1.id]!=!seq1;
!!!!!!var!t0!=!Date.now();
!!!!!!seq1.eq!=!(t)!=>!f(t,!t0);
!!!!!!return!seq1;
!!!!};
!!!!//CCCCCCCCCCCCCCCCC
!!!!seq.seqMap!=!(immutableSeq)!=>!{
!!!!!!var!seq1!=!timeseq.seq(seq.store);!//!new!with!leftCstore
!!!!!!//ds!and!us
!!!!!!//!!seq1.ds!=!ds;
!!!!!!seq1.ds[seq.id]!=!seq;
!!!!!!seq1.dsIsUpdated[seq.id]!=!false;
!!!!!!//!add!self!seq!as!the!u!to!d
!!!!!!seq.us[seq1.id]!=!seq1;
!!!!!!var!it!=!immutableSeq.values();
!!!!!!seq1.eq!=!()!=>!it.next().value;
!!!!!!return!seq1;
!!!!};
!!!!//CCCCCCCCCCCCCCCCC
!!!!seq.us!=!{};
!!!!seq.ds!=!{};
!!!!seq.dsIsUpdated!=!{};
!!!!var!IOT!=!{};
!!!!seq.IndexOnTimestamp!=!(timestamp)!=>!{
!!!!!!return!IOT[timestamp];
!!!!};
!!!!var!TOI!=!{};
!!!!seq.TimestampOnIndex!=!(index)!=>!{
!!!!!!return!TOI[index];
!!!!};
!!!!seq.T!=!(timestamp)!=>!{
!!!!!!if!(store)!{
!!!!!!!!return!(seq[seq.IndexOnTimestamp(timestamp)]);
!!!!!!}!else!{
https://archive.is/r4i8e
93/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
!!!!!!}!else!{
!!!!!!!!throw!new!Error("store!flag!is!not!true");
!!!!!!}
!!!!};
!!!!Object.defineProperties(seq,!//detect!t!update!on!each!seqs
!!!!!!{
!!!!!!!!t:!{!//foo.t
!!!!!!!!!!get()!{
!!!!!!!!!!!!return!valOnT;
!!!!!!!!!!},
!!!!!!!!!!set(tval)!{
!!!!!!!!!!!!log('CCCCCtval');
!!!!!!!!!!!!log(tval);
!!!!!!!!!!!!valOnT!=!tval;
!!!!!!!!!!!!//CCCCCCCCCCCCCCCCCCCCCC
!!!!!!!!!!!!if!(store)!{
!!!!!!!!!!!!!!var!T!=!Date.now();
!!!!!!!!!!!!!!IOT[T]!=!seq.length;
!!!!!!!!!!!!!!TOI[seq.length]!=!T;
!!!!!!!!!!!!!!this[seq.length]!=!valOnT;
!!!!!!!!!!!!}
!!!!!!!!!!!!//CCCCCCCCCCCCCCCCCCCCCC
!!!!!!!!!!!!Object.keys(seq.us).map((id)!=>!{
!!!!!!!!!!!!!!log('CCid');
!!!!!!!!!!!!!!log(id);
!!!!!!!!!!!!!!var!u!=!seq.us[id];
!!!!!!!!!!!!!!//=================
!!!!!!!!!!!!!!if!((false)!&&!(Object.keys(seq.ds).length!!==!0))!{
!!!!!!!!!!!!!!!!//!not!bottom
!!!!!!!!!!!!!!!!throw!new!Error("the!value!depends!on!another!value");
!!!!!!!!!!!!!!}!else!{!//bottom
!!!!!!!!!!!!!!!!u.dsIsUpdated[seq.id]!=!true;
!!!!!!!!!!!!!!!!//propagate!======================================
!!!!!!!!!!!!!!!!log('############bottom!update!###########');
!!!!!!!!!!!!!!!!var!flag!=!true;
!!!!!!!!!!!!!!!!Object.keys(u.ds).map((id)!=>!{
!!!!!!!!!!!!!!!!!!log(id);
!!!!!!!!!!!!!!!!!!log(u.dsIsUpdated[id]);
!!!!!!!!!!!!!!!!!!if!(u.dsIsUpdated[id]!===!false)!{
!!!!!!!!!!!!!!!!!!!!flag!=!false;!//no!functional!library!here
!!!!!!!!!!!!!!!!!!}
!!!!!!!!!!!!!!!!});
!!!!!!!!!!!!!!!!log('=calced!flag');
!!!!!!!!!!!!!!!!log(flag);
!!!!!!!!!!!!!!!!if!(flag!===!true)
!!!!!!!!!!!!!!!!//!the!us's!all!d.isUpdated!===!true
!!!!!!!!!!!!!!!!{
!!!!!!!!!!!!!!!!!!u.t!=!u.eq(tval);
!!!!!!!!!!!!!!!!!!Object.keys(u.ds).map((id)!=>!{
!!!!!!!!!!!!!!!!!!!!u.dsIsUpdated[id]!=!false;
!!!!!!!!!!!!!!!!!!});
!!!!!!!!!!!!!!!!}
!!!!!!!!!!!!!!//=================
!!!!!!!!!!!!!!}
!!!!!!!!!!!!});
!!!!!!!!!!}
!!!!!!!!}
!!!!!!});
!!!!return!seq;
!!};
!!//CCCCCCCC
!!timeseq.seq!=!seq;
!!if!(typeof!module!!==!'undefined'!&&!module.exports)!{
!!!!module.exports!=!timeseq;
!!}!else!{
!!!!window.__!=!timeseq;
!!}
})();
https://archive.is/r4i8e
94/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
批判には知的誠実さが必要とされると思いますが、手段を選ばない2chスレッドでの中傷
謗と渾然一体となって、この記事と連携させながら執拗に書き込みを続けながら、「2
チャンネルへの書き込みはすべて、断じて私ではありません。ご自身の憶測のみによる、
事実ではないご主張で、非常に不快かつ迷惑です。」 などとあからまな虚偽の説明をして
いる、@Lambada の目的は容易に推察可能なものであり、それは実際この記事内で追認
できる「スパゲッティ・コード」や「ループ」という「客観的事実」ではない中傷言葉の
節々から滲み出ており、「客観性」だの「公正さ」を装う欺瞞は即刻中止すべきであると
「私は」感じます。
繰り返しになりますが2ちゃんねるの書き込みについては、そのレス内容、たった数分の
差で投稿される投稿タイミングも合わせ、シンクロナイズする状況として「酷似」してい
ると言うしかなく、個人の印象の領域を出ませんしこれを「客観的事実」と言うつもりは
ありません。個人の印象です。後は個々の読者が抱く印象に委ねたいと思います。
Q_Jirou
0 contribution
Oct 07, 2015 07:26
'Thank
@86Kazoo さん、恒等式と言っちゃった件(しかも式を間違えている)については、たぶ
んここ数ヶ月、間違いを正当化するための理由を練っていると思われます。2ヶ月経ちま
したが、今回は難産のようですね。式を間違えていることをさすがに、ささいなミスとは
言い出さないと思いますよ。繰り返し間違えてますからね。
totemring
0 contribution
Oct 07, 2015 08:55
'Thank
その「ネタ」なら、当まとめでは初出ですが、2ちゃんねるスレッドで見ました。
2ちゃんねるの内輪ネタを仲間内で書いてもわけわからないんじゃないですかね?
また、@86Kazoo
楽しく拝見しており、初心者としては勉強になりました。トピ主に感謝いたしま
す。
Day4も楽しみに待っております。またいずれ見に来ます。
というのは、著者をネットストーキングするグループの主犯格の「青木和律」という人物
によるアカウントであると某所で指摘されていますが、@Q_Jirou同様に、関数型プログラ
ミングの知識はないようですし、事実このコメント欄で技術的言及がなされることは一切
ありません。「恒等式」について曖昧な批判に便乗して著者を個人攻撃したい目的も、ま
たあからさまです。
ここでの一番の問題は、あたかも技術的トピックに興味がある勉強しにきているという、
公正中立な立場を装いながら、その主たる目的はあくまで著者を中傷 謗する、いわば炎
上のマッチポンプの役割を果たしたいということです。
なぜこのような事がこの記事に起こるのか?というと、とりもなおさず上述のとおり、公
正中立に見せかけた @Lambada @nonstarter はじめ、当該2ちゃんねるスレッドとリン
クしながら展開するこの「キャンペーン」に便乗参加しているからだ、ということになり
ます。
言うまでもありませんが、Qiitaはそれこそ「客観的」な技術的情報を共有するサイトであ
り、特定個人への攻撃や、著書をネガティブキャンペーンする場ではありません。
https://archive.is/r4i8e
95/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
本記事はそもそもが主観的なレビューではありますが、Qiitaにおいて存在を許容されてい
るのは、それがあくまで規約に則った社会的利害に沿うものであるという大前提があると
考えます。当方が説明した以上のような状況は明らかにサイトの理念と規約に反してお
り、そのことをここで共有して注意喚起を促したいと考えています。
think49
27 contribution
Oct 07, 2015 11:14
'Thank
2015/07/29 19:28, 2015/08/01 23:22 で通報した者です。
また、荒らされているようなので運営に報告しました。
ここで通報しているのは私一人のようですが、[お知らせ] 領域がわずらわしいと感じてい
る人は他にもいると思われます。
荒らしは相手にせず、[ご意見] から運営に通報するのがスマートな解決手段かと思います
が、いかがでしょうか。
Q_Jirou
0 contribution
Oct 07, 2015 12:47
'Thank
著者が意図してやっている荒らしなのかどうかいまいち確信が持てなかったのですが、今
後はそのようにしましょう。
totemring
0 contribution
Oct 07, 2015 17:56
'Thank
@think49
当方のコメントのどこがどう荒らしなんでしょうかね?
[お知らせ] 領域がわずらわしいと感じている、っていう理由のようですが、私のコメント
数は他のリプライ者以上に圧倒的に多いというわけでもなく、あなたが気に入らないのは
その「内容」なのではありませんか?
あなたが、[お知らせ] 領域がわずらわしいと感じている、他の人もいるはず、って思えば
「荒らし」になるのですか?
Q_Jirou
0 contribution
Oct 09, 2015 08:21
'Thank
また○○○○という名前が出てきましたけど、個人名を出すのは止めたらどうですか。と
いうか、やめなさい。
間違いを指摘したり、記事主に声援送っただけの人をストーキングだのなんだの、ちょっ
とは考えてから書きなさいな。
OmankBSD
0 contribution
Oct 13, 2015 22:19
'Thank
totemringさんは@86Kazooさんのことをネットストーカーだの青木某だの、ちょっと思い
込みで語り過ぎじゃないですかね。
多重アカウントを3度も4度も削除されたことで、自分が悪い事をしているというご自覚ぐ
らいはあるでしょう?
(何度も削除されるという事実を以て、普通は自分に何らかの非があったのではと、省み
https://archive.is/r4i8e
96/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
(何度も削除されるという事実を以て、普通は自分に何らかの非があったのではと、省み
るものですが)
あと、2ちゃんねるは転載禁止だったはずですけど、大丈夫なんですかね?
あなたがご自分のブログで無差別に
謗中傷するのは著者としての責任で勝手にやれば良
いことでしょうけど、Qiitaで2ちゃんねるのログ引っ張ってきてさあどうだって、勘弁し
てくださいよ。
(そもそも、仮にLambadaさんが2ちゃんねるに書き込みしていたからといって、何が問
題なのかも私にはさっぱりわかりません。どこのサービスを使っていようが自由でしょう
し)
totemring
Oct 14, 2015 07:04
'Thank
0 contribution
迷惑行為という観点においては、私は、直近コメントをはじめ表明した考えの通りで、
『[お知らせ] 領域がわずらわしいと感じている人は他にもいる』だから「荒らし」だ、と
いう人物含めて、このように何度も何度も散発的に繰り返される「グループ」による行為
にこそ「迷惑」「荒らし」だという考えを表明しないと一般にはまったく理屈が通らない
わけですが、私のみを「ターゲット」とし「荒らし」扱いする「グループ」は、そういう
@Q_Jirou だの @OmankBSD だの、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-a871b4a89eaed35a8
e89
で引用説明した、@BeastTadokoroにせよ、何度も執拗に2ちゃんねるの 謗中傷常連つ
ながりをアピールしながらも白々しく茶化す、HNひとつとっても明白ですが、一体どの
ようなものか推して知るべしでしょう。
著者のブログにしても「無差別」な「
謗中傷」でないことはあなたたち当事者自身がよ
く理解していることでしょうし、実際ここでも、何度も繰り返しになりますが、他人や著
者のことを勘ぐり、「勘弁してくださいよ」などと、なぜこの人物が言うのか道理が通ら
ない被害者ぶる白々しい茶化しを繰り返すだけであり、いつまでもそうやって毎度毎度、
なんの技術的論点にも寄与することもなく、茶番劇を繰り広げるしかないわけであり、な
んのことはない、いつもの「炎上」マッチポンプのパターンの役割を果たして仲間内で悦
に入り浸っているだけでしょう。直近の流れを見ればそれこそ明白なのですが、常に具体
的コードについて論じているメンバーよりも、上記のような非技術系ユーザによる非技術
系コメント、常に著者を個人攻撃するコメントの頻度のほうが多い時点で異常であるし、
常にそのような個人攻撃横槍コメントで「炎上」マッチポンプが繰り返されている状況で
す。もうそれこそ迷惑なのであとは広い読者の客観的印象に委ねればいかがでしょうか?
私は、彼らは単にこのように延々と技術論と無関係のところで、横槍りに専念し、個人攻
撃とは関係ないと言い訳に終始するあなた方のコメントは白々しい嘘であり、著者を個人
攻撃する複数の2ちゃんねるスレッドと連携させた「炎上」マッチポンプの役割、意図、
目的しかない、迷惑コメントである、と説明はしますが、その私の意見が真実であるかど
うかは読み手の方々はご判断されるでしょう。私はあくまでも、公正公平、そしてQiita、
記事の存在理由から、そのように主張するのみです。
@Lambada による追記:
本体がthis.rx = x; this.ry = y; this.forceUpdate();という破壊的代入・更新しか行わな
い(副作用しか持たない)のですから、表面的にmapを使っていようがfor文等を使
っていようが、まさに命令的ループです。
https://archive.is/r4i8e
97/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
っていようが、まさに命令的ループです。
について論評すると、
たとえば、HaskellにせよOCamlにせよ、いかなる純粋関数型の記述にしろ、UIを「更
新」する以上、それは副作用をもつわけです。
また、UIと言わずとも、LOGを標準出力するコードにしても入出力を伴うすべてのコード
は副作用を持ち、
「純粋関数型」というのは、UI、入出力を伴いプログラミングにおいて「絵に描いた 」
であり単なるカテゴライズ、方向性に過ぎないことは今更議論することでもありません。
彼が批判しているつもりになっている、あるいは悪意をもってわざわざ、批判しているよ
うに見せかけているコード
var!timeseq!=!__([x,!y])
!!!!!!!!.tMap(([x,!y])!=>![50!+!x!*!Drawscale,!300!C!y!*!Drawscale])
!!!!!!!!.tMap(([x,!y])!=>!{
!!!!!!!!!!this.rx!=!x;
!!!!!!!!!!this.ry!=!y;
!!!!!!!!!!this.forceUpdate();
!!!!!!!!});
については、
たとえばHaskellのIOモナドでもなんでもよいですが、
IOモナドは、IO処理に伴われる副作用をプログラムから取り除く、のではなく、
非関数的、非参照透明な副作用部分を単に上澄みの参照透明性の整合を図るために関数に
Wrappingして、隔離しているにすぎません。
故に、仮に上記コードを「命令形ループ」であると攻撃するのであれば、
彼が
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-21e878a30b5a550e5
981
で言う、
岡部氏の命令型コードとは似ても似つかぬ、本当に「時間にしたがって変化するイ
ベントのストリーム1」です。
と主張するコード:
import!Graphics.Element!exposing!(..)
import!Mouse
main!:!Signal!Element
main!=!Signal.map!show!countClick
countClick!:!Signal!Int
countClick!=!Signal.foldp!(\clk!count!C>!count!+!1)!0!Mouse.clicks
も同様に、なんらかのUI,あるいは標準出力などの副作用と接続した時点で、
きっぱりと「表面的にmapを使っていようがfor文等を使っていようが、まさに命令的ルー
プです。」
と評価しなければなりません。そうでないと「客観的事実」とする批判として 褄があわ
なくなるでしょう。
しかし実際彼は自分自身のコードについてだけは、そうは評価していないようなので、
彼の一連のコメントについては、彼がそうみせかけるような数学的、
公正公平な「客観的事実」に基づく批判であるとは断じて認められません。
https://archive.is/r4i8e
98/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
公正公平な「客観的事実」に基づく批判であるとは断じて認められません。
また、そのようなアンフェアな中傷や印象操作でない、よりまともな言説、
FRP (functional reactive programming)のまさに基本中の基本ですが、
(中略)
時刻tにしたがって変化する値f(t)に対する無限に長いリスト[f(0),f(1),f(2),f(3),...]のこと
です。
関数的(functional)ですので、このリスト自体(各要素の値や並び)は決して変化し
ません。
については、まさに、
関数型プログラミングと古典物理学の密接な関係
と著者ブログにおいて解説されているところであり、その具体的な実装として、
x = (v0 cos θ)t
y = (v0 sin θ)t − 1/2gt2
(これは、彼も同意しているFRP=
時刻tにしたがって変化する値f(t)に対する無限に長いリスト[f(0),f(1),f(2),f(3),...]のこと
です。
関数的(functional)ですので、このリスト自体(各要素の値や並び)は決して変化し
ません。
のことです、念の為。)
という物理学の公式が、そのままイミュータブルに、
//10msec!time!resolution
!!//t!seconds!elapsed!since!t0
!!var!t!=!__.intervalSeq(10).tMap((tt,!t0)!=>!(tt!C!t0)!/!1000);
!!var!x!=!t.tMap((t)!=>!V0!*!Math.cos(THETA)!*!t);
!!var!y!=!t.tMap((t)!=>!V0!*!Math.sin(THETA)!*!t!C!1/2!*!G!*!Math.pow(t,!2));
と、宣言されています。
これが、「表面的にmapを使っていようがfor文等を使っていようが、まさに命令的ループ
です。」
とならないモデルを表記したFRPによる宣言的コードであるは明白です。
また、Reactのコンポーネント部分で原理的に不可避なUIの更新について副作用が存在す
るのは、この事実をちゃぶ台返しするものでもなんでもありません。
そして繰り返しになります、そんなことで、
「表面的にmapを使っていようがfor文等を使っていようが、まさに命令的ループです。」
などと言えるのであれば、HaskellのIOモナドにしても何にしても、同じような中傷がな
んでも可能な「客観的事実」ではない言い分である、ということです。
https://archive.is/r4i8e
99/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
んでも可能な「客観的事実」ではない言い分である、ということです。
実際のところ、関数型プログラミング、UI、IO、破壊的更新、副作用、参照透明性は、
@Lambadaひとりの適当な一貫する中傷的「非客観的評価」コメントもそうですが、
この記事シリーズのDay1-Day3、哲学的側面において単純に否定して「著者が理解してな
い」とレッテルを貼れるような代物ではなく、
各所で議論が重ねられているトピックです。
Haskellと副作用の議論の続き
でも、国内に限っても検索すれば、いくらでもヒットしますが、
Brent Yorgey さんは、The Typeclassopediaで「IOモナドだけが魔術的なモナドであ
るということは、強調する価値があります」と書いています。
僕は、IO に加えて ST も含めると、両者に賛成です。Haskell 98 には、ST は含まれ
ていませんので、彼らの説明には「Haskell 98 の中では」という限定があるのかも
しれません。
僕なりに表現すると、ある関数が引数からのみ決まる値を返し、それ以外の仕事を
しないときに「副作用がない」と言います。逆に、同じ引数を与えても、異なる値
を返すことがあったり、それ以外の仕事をする場合には「副作用がある」と言いま
す。
たとえば、返り値が大域変数の影響を受けていたり、printf のように出力したりする
場合は、副作用があるといいます。
「副作用がない」ことと「参照透明である」ことは、同じことだと思っていました
が、どうも違うようです。まだ、これについては、よく分かっていません。
果たして、 @nonstarter @Lambada はじめ、どの程度この辺の議論にコンセンサスをもっ
て深淵な理解のもとで著者を批判しているのか、まったくもって怪しいです。
kazu-yamamotokazu-yamamoto 2010/06/07 12:34
酒井さんのブログにもコメントしたのですが、ST を State でエミュレートできると
考えている人が、副作用はないと主張するのは理解できます。State の状態が >>=
の後ろに隠れているだけということも理解しています。しかし、ST は State に似て
いるけれど、State ではないと思っています。実際に破壊的な代入をすることが目的
のモナドですので。ST が分かりにくければ、IO でもいいです。この場合、World と
いう状態を持ち出して、副作用がないと主張するのでしょうが、命令型言語プログ
ラマーにとって World は言語の内側ではなく、外側の世界ですよね?
kazu-yamamotokazu-yamamoto 2010/06/07 12:39
http://d.hatena.ne.jp/kazu-yamamoto/20090627/1246135829 で分類しているので
すが、関数型プログラマーの方は、あるときは評価器までが Haskell で副作用がな
いといい、またあるときは環境までが Haskell で副作用がないと言います。立場を
すり替えるのも問題ですが、本当の問題は実行器までが Haskell だと思って説明し
てくれないところです。
実際に根源的に命令型的挙動でしか記述できない、IO、UI部分は、 State だろう
が World だろうが、どの道末端部分で究極的には「破壊的更新」されます。
それは我々の目の前の現実世界が刻々と「破壊的更新」されているように見えるのと同じ
ことです。
https://archive.is/r4i8e
100/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
関数型プログラミング、FRPで、NGなのは、そのように、IO,UI部分、現実世界とと粗結
合な要素、モデルまで「破壊的更新」をしたら、
モデルとしての論理整合性がコントロールできなくなるので、IOモナドにしろ、隔離して
扱おうという方針です。
//10msec!time!resolution
!!//t!seconds!elapsed!since!t0
!!var!t!=!__.intervalSeq(10).tMap((tt,!t0)!=>!(tt!C!t0)!/!1000);
と、まず時間軸部分をFRPでモデル化明示して、最後のUIコンポーネントで破壊的更新が
ある(原理的に不可避で当たり前)であるのは、ひとつの明快な関数型プログラミングの
回答であると思いますが、このような考察とは、まるで関係ない浅い中傷で終わっている
時点で、
「客観的評価」ではありません。
SaitohMDMA_Love
0 contribution
Oct 14, 2015 22:57
'Thank
昨年から関数型に取り組み始めましたが、国内には記事自体が少ないため大変ためになり
ました。いろいろ混乱をきたす書籍や記事が多いようで私も
されたくちですが、救われ
ました。関数型(の普及・浸透)はまだまだこれからの分野なのかな、と思います。なに
やらものすごい数のコメントが抹消されているようですが、荒らし行為(どうも批判対象
の本を書いた作者本人の殴り込みのようですね・・・)に屈せず頑張ってください。
※しかし、運営さんも作者を罰しても、そのコメントまで消すことは無いと思うんです
が・・・・荒らしでない方のコメントが把握できなくなるので少々困りました。
nonstarter
179 contribution
Oct 15, 2015 02:05
'Thank
@SaitohMDMA_Love さん
昨年から関数型に取り組み始めましたが、国内には記事自体が少ないため大変ため
になりました。いろいろ混乱をきたす書籍や記事が多いようで私も されたくちで
すが、救われました。
ありがとうございます。そういってくださる方が一人でもいれば、この記事について私の
意図した社会的意義がまずは達成されたということになるかと思います。私自身は関数プ
ログラミングのエヴァンジェリストでもなんでもなく、それを推進するとかしないとかい
う立場にはないのですが、Haskellを初めとして様々な関数型プログラミング言語を便利
に利用させてもらっている身として、多少とも関数プログラミングに関して(当該の書籍
などのようにおかしなものではないまっとうな)認識が広まることを祈っています。
pknn
0 contribution
Oct 15, 2015 10:58
'Thank
はじめまして。いつも楽しく 1読んでおります。
ずっと問題になり続ける Date.now() についてなのですが、
岡部さんの現実世界のイメージが決定論的なものであることに由来するのでは?と思いま
https://archive.is/r4i8e
101/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
した。
何か間違ってるとこあったら指摘ください。
岡部さんの科学哲学の記事
http://kenokabe-techwriting.blogspot.jp/2015/01/blog-post_28.html
http://kenokabe-techwriting.blogspot.jp/2015/01/2.html
を読んでいると、
「現実の世界は不変であり、
あらゆる未来と意思は、あらかじめ決定されているもの」
として、岡部さんは捉えているようです。
そして、それが岡部さんのプログラムにも哲学として反映された結果、
「ユーザによってプログラムが実行された時間は厳密に定まり、時空間内で不変の位置を
持つ。
Date.now() は明らかに不変な、すでに定まっている値を参照し、時刻形式に直すだけの
関数だから、参照透明性がある」
という思想になるのではないかと思います。
しかし私を含め、多くのプログラマーは、
プログラムからみた現実の世界をそうとらえてはいません。
現実の世界は非決定的で、不純で、複雑で、せいぜい確率で表せるかどうか、
というものとして考えています(いますよね)。
関数型の人になると、それに加えて、OSとかカーネルの動き(メモリとか?)についても、
不純だしあんまり触りたくない、と考えているだろうと思います 2。
ましてやユーザの実行時間なんて、2038年以降かもしれないし、そもそも人類の使ってる
時間かどうかもわからない、
何が入ってるか全然分からないもの です。
たぶん、参照透明という言葉の定義が全くすれ違っている3のは、
そういう、現実の世界とプログラムのかかわりのイメージに差異があるためではないかと
思っています。
どうでしょうか?
1. すでにただのケンカになってますので、いちおう立場を書いておきますが、私は岡部さんのファン
です。ただ、技術的なことに関して岡部さんが正しいと思ってるわけではないです。あとHaskell勉
強中です。
2. 私が関数型初心者なのでそう思うだけなのかもしれません。真のHaskellプログラマはメモリの書き
換えによるチューニングも自在に行うのかも…
3. 「参照透明」ということばそのものは、関数型コミュニティで十分に定義されたものであることは
理解しているつもりですが、そういう話はこの場ではもはや意味をなさないだろうと思いましたの
で、定義がすれ違うという表現を使いました。
Q_Jirou
0 contribution
Oct 15, 2015 12:54
'Thank
ケンカしてるというより、一方的に著者に作り話を前提にした、わけのわからん批判をさ
https://archive.is/r4i8e
102/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
れてるだけなんですが...まあ、いいですけど。
何度アカウントを取り上げられても来る人が勝手に怒ってるだけなんですよ。
@pknnさんや@SaitohMDMA_Loveさんも「2ちゃんねるで俺を中傷してる」と言われな
いことを祈ります。
Day2もお勧めです。
totemring
0 contribution
Oct 28, 2015 17:33
'Thank
@Lambada が(および @nonstarter も同意義において) 本記事コメント内で主張する
逆に(時間にせよ何にせよ)プログラム上に存在しない暗黙の引数を考えれば参照
透明などと言い出したら、状態に依存したどのような関数も参照透明になってしま
い「参照透明」という概念の存在意義がなくなってしまいますので、そのような定
義があり得るとは思いません。
特に、
(時間にせよ何にせよ)プログラム上に存在しない暗黙の引数を考えれば参照透明などと
言い出したら、という要点箇所についてですが、
最近UPされ非常に人気を集めているらしいQiita内の良記事(ここの<議論>に触発され
たのかもしれませんが)
「参照透過である」とは、何から何への参照がどういう条件を満たすことを言うのか
で紹介されているUday S. Reddy 氏(バーミンガム大の計算機科学の教授で、関数型言語
や OOP について研究をしておられるようです、とリンク先の記事では紹介)では根本的
に反
されています。
この記事によると、
彼らは、一つの点については意見を一致させます、「referent・denotation は形式言
語の外側に存在し、言語内の expression は、それらに対して言及することしかでき
ない」と。つまりは、人が言語を用いて出来ることというのはせいぜい、一つの
expression を、それと同一の実体を指し示す他の expression に入れ替える程度のこ
とだということです。referent・denotation そのものは、言語内には存在しないので
す。
「関数型言語コミュニティ」において従来の哲学的、意味論、本質的概念から外れ、伝言
ゲームのような成り行きで謂わばバズワード化してしまった「参照透過性」という経緯が
詳細に説明されており、本来の意味では
↓↓
「参照」=「referent・denotation は形式言語の外側に存在し、言語内の expression
は、それらに対して言及することしかできない」という、歴史的にかなり重いコンセンサ
スが存在している具体的事実が強調されています。
言うまでもありませんが、
(時間にせよ何にせよ)プログラム上に存在しない暗黙の引数 @Lambada
https://archive.is/r4i8e
103/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
プログラム上に存在しない = 形式言語の外側に存在しているものとは、具体的にここで
問題視されている Date.now() において「暗黙に」「言及する」Reddy 氏が指摘する本来
の意味で透明に「参照」する時間のことです。
こうして振り返ってみると、ランディンやストレイチーによる、用語を簡略化しよ
うとする努力によって “reference” や “denotation” が「値」に置き換えられたわけ
ですが、これは軽率だったと言えるでしょう。その結果、人は「値」と聞くや、評
価のプロセスを想起する衝動が生じるようになってしまい、上記のような考えに至
ってしまいました。同様に、評価によって生じるものが「値」であると(たとえ、
それがあきらかに denotation でないと分かっていたとしても)考える衝動も生じて
います。このような「参照透過」の考え方を、私は関数型プログラマらの中に見て
きました。しかし、初期の意味論の研究者によって語られた「値」は、評価の結果
や関数等の出力ではなかったのです。denotation のことだったのです。
(訳注: 形式言語 - Wikipedia)
ひとたび式の(いわゆる)「値」(かつての哲学者の講釈に従えば “referent”,
“denotaion” ですが)を複雑な数学的・観念的なオブジェクトと見なすことができれ
ば、あらゆる種類の可能性が開けてきます。
そもそも、「現在時間」なんてものが、「プログラム上に存在」=「形式言語の内側に存
在」なんてしているわけがない、つまり形式的に表現する術などあるわけがないので原理
的に「暗黙的」になるしかないわけですが、ここで批判される著書からの流れで私がいく
ら書いてもその根本的部分、つまり「哲学的洞察」については理解されなかったようで
す。
同時に、@pknn による言及
「参照透明」ということばそのものは、関数型コミュニティで十分に定義されたも
のであることは理解しているつもりですが、そういう話はこの場ではもはや意味を
なさないだろうと思いましたので、定義がすれ違うという表現を使いました。
「参照透明」ということばそのものは、関数型コミュニティで十分に定義されたものであ
ること
というのは、まったく事実ではありません。
実際、私がここで、
えー、Wikipediaの記載は確認しました。英語版のWikipediaの記載を引っ張りだし
て恥ずかしくないのですか?
当該記事について貴方がWikiにデタラメを書いたのではない保証とかあるのでしょ
うか?
学術的にコンセンサスは取れている情報であると担保でもあるのでしょうか?
と「軽いツッコミ」も@Lambada の主張にむけて入れましたが、
「参照透過である」とは、何から何への参照がどういう条件を満たすことを言うのかで紹
介されているUday S. Reddy 氏によれば、
関数型言語のプログラマによる参照透過に関する考え方は、以下の 3 点において、
https://archive.is/r4i8e
104/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
関数型言語のプログラマによる参照透過に関する考え方は、以下の 3 点において、
標準的な参照透過の概念と異なっているようです。
哲学者や論理学者は用語として「reference(参照)」「denotation(明示的な意
味)」「designatum(指示されるもの)」「bedeutung(Frege が用いるドイツ
語の用語)」などを用いるのですが、関数型のプログラマは「値(value)」を
用います(これは関数型のプログラマに限った話ではなく、ランディンやストレ
イチーとその後継者達も “reference” や “denotation” の意味で「値」を用いてい
ます(訳注: ピーター・ランディン
Peter Landin - Wikipedia, the free encyclop
edia)。これはどうやら、単なる用語の簡略化であり、ランディンやストレイチ
ーが導入したもののようなのですが、厳密な議論の際にはそれらは大きな違いに
なり得ますので、注意を要します)
関数型のプログラマは、これらの「値」はプログラミング言語の外ではなく内側
に存在していると考えているようですが、この点では、哲学者のみならず、プロ
グラミング言語の意味論の研究者たちとも全く異なっています
彼らは、これらの「値」は評価のプロセスを経て得られると考えているようです
たとえば、今朝の時点の Wikipedia の「参照透過」に関する項目を見てみると、そ
こには下記のような記述があります。
式は、プログラムの挙動を変えることなしに、その式をその値と置換するこ
とが可能であるならば(言い換えると、同じ入力に対して、同様の効果と出
力をするプログラムを生成することができるならば)、その式は参照透過で
あると言える。
これは、哲学者や論理学者が言うところとは、全く相容れません。哲学者・論理学
者の考え方では、あるコンテキストが参照透過であるということは、そのコンテキ
スト内のある expression が、それと同一の実体を指す expression(同一指示の
(coreferential)expression)と交換可能であることを言うのです。ここで言う「哲
学者」や「論理学者」とは誰かですって? それはフレゲでありラッセルでありホワ
イトヘッドであり、カーナップ、クワイン、チャーチ他、数え切れないほどのその
他大勢のことです。どの一人を取っても、ハンパない大人物たちであり、彼ら論理
学者の知性の力を統合すれば、地球を壊滅させるに値するほどの偉人達です。彼ら
は、一つの点については意見を一致させます、「referent・denotation は形式言語の
外側に存在し、言語内の expression は、それらに対して言及することしかできな
い」と。つまりは、人が言語を用いて出来ることというのはせいぜい、一つの
expression を、それと同一の実体を指し示す他の expression に入れ替える程度のこ
とだということです。referent・denotation そのものは、言語内には存在しないので
す。しかし、だとするならばなぜに関数型のプログラマたちは、こうも古くから確
立された考え方から逸脱した捉え方をしているのでしょうか?
と書かれています。
では、ここで、 @Lambada が上から振りかざしたような言及、もちろん英語版Wikipedia
なぞは論外ですが、その他、
英語版Wikipedia
https://en.wikipedia.org/wiki/Referential_transparency_%28computer_science%29
https://archive.is/r4i8e
105/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
や、英語版Wikipediaから参照されGoogle Scholar
https://scholar.google.com/scholar?q=referential+transparency
でもトップに来る標準的な学術論文
http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf
をご覧ください。一つ目の英語版Wikipediaの現時点での記述は(ここでの議論に関
連する範囲では)二つ目や三つ目のような数多くの(というか確認できる限り全て
の)査読付学術論文と整合的で信頼できます。ご参考までに、例えば以下の記述が
あります。
today() is not transparent, as if you evaluate it and replace it by its value (say, "Jan
1, 2001"), you don't get the same result as you will if you run it tomorrow. This is
because it depends on a state (the time).
(私訳:「today()は参照透明ではありません。評価して値(例えば"Jan 1, 2001")
で置き換えると、明日に実行するのと同じ結果が得られないからです。これは
today()が状態(時間)に依存しているためです。」)
とは一体なんだったのか??ということになります。
私は、続くコメントで、
標準的な学術論文ということは、誰かの学術的主張ということですね?
私が問いただしているのは、その学術論文とやらが、サイエンスのコンセンサスを
得るに至っているのか?
ということです。
あなたが、ある一定の学術論文のその主張に与しているから、それを都合よく参照
したからといって、正しいとはなりません。
はて、私が「仮に」真逆の主張、著者の主張と同調する内容の論文でも発表すれ
ば、自動的にそれが正しくなるのですかね?
と問いただしましたが、歴史的コンセンサスの文脈に置いては、著者、Reddy 氏の主張の
ほうがコンセンサスが取れていると言える。
逆に、関数型コミュニティにおいては、国内、国外問わず、かなりいい加減な経緯でバズ
ワード的にコンセンサスがないと観察できます。
もちろん、Uday S. Reddy 氏(バーミンガム大の計算機科学の教授で、関数型言語や
OOP について研究をしておられるようです、とリンク先の記事では紹介)が何を主張し
ようとも、
こで言う「哲学者」や「論理学者」とは誰かですって? それはフレゲでありラッセ
ルでありホワイトヘッドであり、カーナップ、クワイン、チャーチ他、数え切れな
いほどのその他大勢のことです。どの一人を取っても、ハンパない大人物たちであ
り、彼ら論理学者の知性の力を統合すれば、地球を壊滅させるに値するほどの偉人
達です。彼らは、一つの点については意見を一致させます、「referent・denotation
は形式言語の外側に存在し、言語内の expression は、それらに対して言及すること
しかできない」と。つまりは、人が言語を用いて出来ることというのはせいぜい、
一つの expression を、それと同一の実体を指し示す他の expression に入れ替える
程度のことだということです。referent・denotation そのものは、言語内には存在し
ないのです。しかし、だとするならばなぜに関数型のプログラマたちは、こうも古
https://archive.is/r4i8e
106/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
ないのです。しかし、だとするならばなぜに関数型のプログラマたちは、こうも古
くから確立された考え方から逸脱した捉え方をしているのでしょうか?
それは、著書で批判される「権威主義」への盲信で片付けることも可能でしょう。
しかし、「参照透過性」の定義について、 @Lambada が上から振りかざしたような権威
の引用、あるいはコンセンサスについては、彼はまるで浅い調査で終わっており、吹けば
飛ぶようないい加減なものであった、という証明にはなると思います。
ここで何が言いたいのか?というと、自分自身の頭で深く考えることもせず、他人の主張
を否定するためだけを目的にしたような、都合の良い文献だけ並べてコンセンサスがあ
る、異端だと断定する、一連のアカウントの思慮不足です。
もちろん「用語の概念について、歴史的コンセンサスはどうであれ、あくまで関数型コミ
ュニティ内のバズワードとして共有されている」と言い逃れることも可能でしょうが、そ
んな「哲学的意味」がまったくない用語、また哲学的意味が皆無であるが故に、誰一人本
当の意味なんて理解できず、ただ難解にありあがたって振り回すだけのバズワードに、一
体なんの意味があるのか?という根本的疑念は、「普通の人」ならば抱くことでしょう。
紹介された歴史的経緯からは、「中途半端な理解、誤解、誤読による本質を外れた解釈の
変遷」でしかないのですが、そこに「内輪で執着する」学術的意義など微塵も存在しない
のは明白です。
関数型言語のプログラマたちは、それら命令型言語を「参照透過」とは呼びたがら
ないでしょうから、そういった複雑な数学的・観念的オブジェクトを「値」である
と認めることも嫌がるでしょう。それでいてそれらの状態変換器が、彼らの好むと
ころの文法や「モナド」などというバズワードによって取り込まれるや、「値」と
呼ぶことに抵抗がなくなるようです。この姿勢は一貫性に欠くではないかと言わざ
るを得ません。たとえ彼らの「参照透過」の考え方にある程度の統一性が認められ
たとしてもです。
追記)リンク先記事にて、 Date.now() が「参照透過」であるという解釈について、一定
のまとめをポストしたので、こちらでも議論の流れで再掲しておきます。
trombicdashの言う
70%
いうまでもなくDate.now()関数が参照透過であることは、むろん情報技術者のあい
だでも国際的なコンセンサスが醸成されているものですが
というのは、事実と異なります。
Date.now()関数が参照透過であるという解釈は正しいと考えますが、その是非については
コンセンサスでなく、反発のほうが多いのが現実でしょう。
Date.now()関数が参照透過であること
は、
「参照透過」についてのReddy氏が紹介する歴史的に存在する従来のコンセンサス
式の(いわゆる)「値」(かつての哲学者の講釈に従えば “referent”, “denotaion”
ですが)を複雑な数学的・観念的なオブジェクトと見なす
https://archive.is/r4i8e
107/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
そういった関数は、先にも触れた複雑な数学的オブジェクトの一種であり、文法的
な意味での「値」ではありません。
に従えば、
Date.now() というexpression は、
数学的・観念的なオブジェクトである「現在時刻」という、referent/denotionを一意に示
せるので、
「参照透過」であると判断できます。
もちろん、
関数型のプログラマは、これらの「値」はプログラミング言語の外ではなく内側に
存在していると考えているようですが、この点では、哲学者のみならず、プログラ
ミング言語の意味論の研究者たちとも全く異なっています
彼らは、これらの「値」は評価のプロセスを経て得られると考えているようです
という現実があり、数学的・観念的なオブジェクトである「現在時刻」という、
referent/denotionはコード内部には存在しないので、
関数型言語のプログラマたちは、それら命令型言語を「参照透過」とは呼びたがら
ないでしょうから、そういった複雑な数学的・観念的オブジェクトを「値」である
と認めることも嫌がるでしょう。
ということになります。
Linked from
comment on
を言うのか 7 days ago
「参照透過である」とは、何から何への参照がどういう条件を満たすこと
Linked from
comment on
を言うのか 7 days ago
「参照透過である」とは、何から何への参照がどういう条件を満たすこと
totemring
0 contribution
Oct 30, 2015 20:00
'Thank
@Lambada による追記
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-8f454373d806047c7
a5e
について、こちらで補足しておく必要があるでしょう。
長くなったので、前回のコメントとは分けてポストします。
まず、コメントの最後蛇足部分
誠に失礼ながら、totemring氏はそれらの論文やReddy氏のコメントの内容を
全く理解されていないと言わざるを得ませんし、totemring氏がご理解される
まで私が解説する義務があるとも思いません。
についてですが、私が「Reddy氏のコメントの内容を全く理解されていない」というの
https://archive.is/r4i8e
108/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
についてですが、私が「Reddy氏のコメントの内容を全く理解されていない」というの
は、全く事実と異なり、実際残念がら理解に届いていないのは、@Lambadaであるという
ことを以下説明します。
P.S. 下のほうでtotemring氏が参照されているReddy氏のコメントは私が挙げたよう
な査読論文ではありませんが、氏が述べている参照透明性は、私が挙げた査読論文
の定義と一致します。
定義は一致していません。それは続く以下の言及で明らかとなっています。
また、氏が挙げているQuineやStrachyの論文を見ても、大まかに言うと「文の一部
をその値(参照する対象)で置き換えても全体の意味は変わらない」という、私や
nonstarter氏が用いている参照透明性の定義と一致します。
「文の一部をその値(参照する対象)で置き換えても全体の意味は変わらない」というの
が、 @Lambada や @nonstarter による定義である、ということです。それは再三再四、
彼らが書いているのをここで見ているので、私もその他の人も異論はないと思います。
さて、ここで、「Reddy氏のコメントの内容をきちんと理解していれば」以下のような明
白な骨子が読み取れるでしょう。
「参照透過である」とは、何から何への参照がどういう条件を満たすことを言うのかの中
盤あたり、
関数型言語界隈へストレイチーやランディンがもたらした
もの
の中には、
関数型言語のプログラマによる参照透過に関する考え方は、以下の 3 点において、
標準的な参照透過の概念と異なっているようです。
哲学者や論理学者は用語として「reference(参照)」「denotation(明示的な意
味)」「designatum(指示されるもの)」「bedeutung(Frege が用いるドイツ
語の用語)」などを用いるのですが、関数型のプログラマは「値(value)」を
用います(これは関数型のプログラマに限った話ではなく、ランディンやストレ
イチーとその後継者達も “reference” や “denotation” の意味で「値」を用いてい
ます(訳注: ピーター・ランディン
Peter Landin - Wikipedia, the free encyclop
edia)。これはどうやら、単なる用語の簡略化であり、ランディンやストレイチ
ーが導入したもののようなのですが、厳密な議論の際にはそれらは大きな違いに
なり得ますので、注意を要します)
関数型のプログラマは、これらの「値」はプログラミング言語の外ではなく内側
に存在していると考えているようですが、この点では、哲学者のみならず、プロ
グラミング言語の意味論の研究者たちとも全く異なっています
彼らは、これらの「値」は評価のプロセスを経て得られると考えているようです
とあり、これがまさに、これまで延々と@Lambada や @nonstarter が主張してきた、
https://archive.is/r4i8e
109/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
とあり、これがまさに、これまで延々と@Lambada や @nonstarter が主張してきた、
Reddyが指摘する「関数型言語のプログラマによる参照透過に関する考え方」であり、そ
れは、「標準的な参照透過の概念と異なっている」と批判されているのです。
実際に、先述のとおり、@Lambada が
「文の一部をその値(参照する対象)で置き換えても全体の意味は変わらない」という、
私(Lambada)やnonstarter氏が用いている参照透明性の定義
という @Lambadaが考える定義の中の「値(参照する対象)」についてですが、先段確
認済みのように、
彼のいう「値(参照する対象)」に対する理解とは、、
逆に(時間にせよ何にせよ)プログラム上に存在しない暗黙の引数を考えれば参照
透明などと言い出したら、状態に依存したどのような関数も参照透明になってしま
い「参照透明」という概念の存在意義がなくなってしまいますので、そのような定
義があり得るとは思いません。
ということでした。もちろんこれは、まさにReddyが列挙する、
関数型のプログラマは、これらの「値」はプログラミング言語の外ではなく内側に
存在していると考えているようですが、この点では、哲学者のみならず、プログラ
ミング言語の意味論の研究者たちとも全く異なっています
という批判対象そのものです。
つまり、@Lambadaがいう「値」とは、「プログラム上に存在しない暗黙の引数」は参照
透過の概念の対象としてありえない、と明言していることから、言語外に存在する「値」
(denotation/referent)ではなく、言語内にしか存在しない数式上の「式と値」のことである
と確認できます。同じ「値」でも言語内外で対比になる概念だ、というのがReddyの主張
の骨子なのですから、論者がどちらの意味で「値」という用語を使っているのか?見極め
ることが一番大事です。
念のために、
@Lambadaが同じ見解だと一貫して主張する @nonstarterによる論述を確認しても、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-8ba1e01d84e7fe903
421
うわあ……
同じラムダ式(λx.x)が(λx.x) 1とか(λx.x) 2とか異なった値に順次適用されるたびに
「時間の変化に応じてxが1から2に変化している!」とか言っちゃうんですかね。
凄いなあ。
これはあれですね、map (\i -> 2*i) [1,2,3,4](== [2,4,6,8])でiが「変化」するんだっ
て考えるのは、iをループカウンターみたいに考えがちな命令型に慣れきった人なら
ではの発想ですね。でいずれにせよ、関数の仮引数が呼び出しごとに実引数に応じ
て別の値になるのは参照透明性と何の関係もないんですが:
t1 = Date.now(); (0∼9まで足してコンソールに表示); t2 = Date.now();
console.log(t1 == t2);
https://archive.is/r4i8e
110/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
と
t1 = Date.now(); (0∼9まで足してコンソールに表示); t2 = t1; console.log(t1 ==
t2);
とで結果が異なる、というDate.now()の単純明瞭この上ない「参照不透明性」をど
うするつもりなのかはまったく
のママなわけです。
などと書いているので、これは、言語内の「式」expression(表現)で完結した「値」で
あると考えて間違いないでしょう。
Reddyが列挙する、(さらに批判する)
彼らは、これらの「値」は評価のプロセスを経て得られると考えているようです
という要素に該当することも確認できました。
よって、言語外でなく言語内の「値」として@Lambadaがいう
「文の一部をその値(参照する対象)で置き換えても全体の意味は変わらない」という、
私(Lambada)やnonstarter氏が用いている参照透明性の定義
と、@Lambadaが一貫して擁護しているWikipedia英語版にある、Reddyも引用して批判
する「参照透過」の定義
式は、プログラムの挙動を変えることなしに、その式をその値と置換することが可能であ
るならば、その式は参照透過である
上記2文が意味するところはまったく同じであることが確認できます。
その「参照透過」の定義について、Reddyは、
これは、哲学者や論理学者が言うところとは、全く相容れません。哲学者・論理学
者の考え方では、あるコンテキストが参照透過であるということは、そのコンテキ
スト内のある expression が、それと同一の実体を指す expression(同一指示の
(coreferential)expression)と交換可能であることを言うのです。ここで言う「哲
学者」や「論理学者」とは誰かですって? それはフレゲでありラッセルでありホワ
イトヘッドであり、カーナップ、クワイン、チャーチ他、数え切れないほどのその
他大勢のことです。
と批判しています。
結論として、
下のほうでtotemring氏が参照されているReddy氏のコメントは私が挙げたような査
読論文ではありませんが、氏が述べている参照透明性は、私が挙げた査読論文の定
義と一致します。
という彼の言い分というか、よくわからないですが、どういう角度から眺めてみても、
Reddy氏の指摘する従来の意味論における参照透過性の定義は、
@Lambadaがこれまで主張してきた、参照透過の定義とは一致せず、
むしろ、Reddy氏が批判する、バズワード的に変遷した定義であった、ということになり
ます。
https://archive.is/r4i8e
111/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
totemring
2015/11/05 0:41
Oct 31, 2015 07:21
'Thank
0 contribution
@Lambada による新たな脚注追記
論文 http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf 511ペー
ジにある参照透明(purely referential)の定義e1 = e2
e[e1/p] = e[e2/p]における=
は、510ページで表示的意味(denotational semantics) Dにより定義されているので、
まさにReddy氏の言う言語の外の表示(denotation)です(実際、この論文の対象言語
の表示的意味は集合で定義されている一方、言語自体の中に集合の式の構文はあり
ません)。なお、同じ論文の第1章では、Reddy氏と同じくQuineの議論を忠実に追
った上で、Reddy氏と同様にStracheyの理論を詳しく説明しています(この論文は
1990年に発表されています)。
以上の言及だけを捉えると、
下のほうでtotemring氏が参照されているReddy氏のコメントは私が挙げたような査
読論文ではありませんが、氏が述べている参照透明性は、私が挙げた査読論文の定
義と一致します。
という言及とは一見整合が取れては居るように見えるのですが、それはあくまで、
「値」denotationが言語外にある、という前提においてのみです。
しかし、これまで一貫して、@Lambadaは、
「値」denotationが言語内にある、という前提で議論していました。
繰り返しとなりますが、傍証として、
@Lambadaが同じ見解だと一貫して主張する @nonstarterによる論述を確認しても、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-8ba1e01d84e7fe903
421
やはり、
「値」denotationが言語内にある、という前提で議論していることが確認できます。
やはり問題となるのは Date.now() が参照透過か否か?という議論になるわけで、
私の直近コメント
でその議論における@Lambada の見解は以下であると確認しましたが再掲:
逆に(時間にせよ何にせよ)プログラム上に存在しない暗黙の引数を考えれば参照
透明などと言い出したら、状態に依存したどのような関数も参照透明になってしま
い「参照透明」という概念の存在意義がなくなってしまいますので、そのような定
義があり得るとは思いません。
太字は私による強調ですが、 Date.now() というexpressionの「値」denotationが、「現
在時刻(時間)」という言語外(プログラム上に存在しない・・・)という構造では、参
照透過という概念の存在意義がなくなる、
という理由で@Lambadaは拒絶したので、
「値」denotationが言語外にある、という前提ではないとしか読解のしようもありませ
ん。
その、Reddy氏のコメント及び一致するとされる査読論文の論旨と不整合であるのは明白
https://archive.is/r4i8e
112/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
その、Reddy氏のコメント及び一致するとされる査読論文の論旨と不整合であるのは明白
です。
totemring
Nov 01, 2015 00:34
'Thank
0 contribution
@Lambada による新たな脚注追記
論文 http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf 511ペー
ジにある参照透明(purely referential)の定義e1 = e2
e[e1/p] = e[e2/p]における=
は、510ページで表示的意味(denotational semantics) Dにより定義されているので、
まさにReddy氏の言う言語の外の表示(denotation)です(実際、この論文の対象言語
の表示的意味は集合で定義されている一方、言語自体の中に集合の式の構文はあり
ません)。なお、同じ論文の第1章では、Reddy氏と同じくQuineの議論を忠実に追
った上で、Reddy氏と同様にStracheyの理論を詳しく説明しています(この論文は
1990年に発表されています)。
繰り返し「彼」が示す、
論文 http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf 511ペー
ジ
にある参照透過の定義について、
「彼」が「値」についてどのように、考えているのか、あるいは考えていたのか?思考の
理路を
れるので、まず
私の過去のコメント
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-b236a60949c39c5f6
296
再掲し、そこから論証します。
上記案件について、@Lambada らしき人物が、著者を個人攻撃する2チャンネルスレッド
でレスしていたので、該当箇所を引用します。
7!:仕様書無しさん:2015/10/06(火)!09:51:29.03
当たり前だけど念のため、岡部の理論は100%完全にデタラメ。!
そもそも岡部以外にDate.now()が参照透明なんて言ってる奴は世界中に誰もいないが、!
英語版Wikipediaも間違ってるとか言い出したから一応、専門の研究者に広く受け入れられている厳密な
定義は!
論文!http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf!の第4節(p.511)
な。!
当然、Date.now()やtoday()は参照透過でない。
43!:仕様書無しさん:2015/10/06(火)!10:39:42.99
>>30!
>Date.now()が参照透明<じゃない>っていうのがまったく繋がらないんだけど、どうなってんのこれ?!!
本気で言ってるのwwww?!
Date.nowの引数(空集合φ)についてφ=φが成立するのに!
Date.now(φ)とDate.now(φ)の値が異なってしまうので!
Date.nowが(0番めの)引数についてpurely!referentialでなく、!
それゆえreferentially!transparentでない、ということすら!
この定義から読み取れないようなそんな学力でグダグダ抜かしてるわけwwww?!
50!:仕様書無しさん:2015/10/06(火)!10:49:41.62
https://archive.is/r4i8e
113/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
50!:仕様書無しさん:2015/10/06(火)!10:49:41.62
>>46!
>それ、現実の物理世界の時間はどう数学的に反映されてんの?ってQiitaでつっこまれてること!
>繰り返してるだけだろ?!
意味不明なんですけど。!
あるexpressionにreferential!transparencyを保ちつつ時間に対応して!
異なった値を取らせたければ時間を表す引数がなければならないし、!
それがないならばreferentially!opaqueになるというだけのことなんだが。!
61!:仕様書無しさん:2015/10/06(火)!11:03:17.58
>>54!
>「現在時間」を「時間を表す引数」として表すのはどうすんの?!
>つまりDate.now()の引数がカラだって文句垂れてるわけだが、!
>これの、「現在時間」を「時間を表す引数」をわたす表記をおせーてよ!
「表記」ねえ。この時点でもうなんにも理解できてないのがわかるんだが……!
引数を追加するのは!
Date.now(a1)!
のようにしてやればいいだけだ。!
この引数位置の引数が時間を表すかどうかはsemanticsの問題で、syntaxの問題じゃない。!
なお、上記は、当方の問いかけ
tomorrow という時間要素について、コードがモデル化する物理世界に数学上どのよ
うに反映されているのですか?
まさか「無視」なんでしょうか?そういうことが論じられているわけですが。
run on "Jan 1, 2001" today
"Jan 1, 2001"
ruo on "Jan 2, 2001" tomorrow
"Jan 2, 2001"
私には「参照透明」にしか見えないですが。
についての回答としてまるで成立していないことは説明は不要でしょう。
現実世界のモデル化において、時間要素を「数学的に」無視しているのは何故か?
という確認をしているに過ぎません。
という論点において、ユーザが現実世界において、 today や tommorow という「差異」を
生じさせている現象を伴いながら、コードをrunnningさせる時間要素については、上記2
ちゃんねるレスの数学的説明にはまったく考慮されていないことを申し上げています。
【追記】
@Lambada とおぼしき人物が2ちゃんねるで主張するには、
92!:仕様書無しさん:2015/10/06(火)!11:47:58.55
Date.now()!(==t1)!
Date.now()!(==t2)!
(sub)expressionが同じなのに値が異なる。!
Sondergaard&Sestoft!1990,!p.!511の定義に従って、!
expression!"Date.now()"!は参照透明でない。!Q.E.D.!
ということらしいです。(呆れ)
Date.now()!(==t1)!
Date.now()!(==t2)!
というのは、関数型・宣言型のコードではありえず、
https://archive.is/r4i8e
114/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
というのは、関数型・宣言型のコードではありえず、
宣言型であるのならば、当然
Date.now()!(==t1)!
Date.now()!(==t1)!
と(理論上)「同時」に評価されます。宣言型のコードには上下関係と時間軸の関係は
(理論上)ないので(今更ですが、基本ですよね)。
@Lambada とおぼしき人物が著者を個人攻撃する2ちゃんねるでレスしたコード
Date.now()!(==t1)!
Date.now()!(==t2)!
となるのは、このコードが宣言型でなく、コードの上下方向にフローする命令型のコード
の場合です。
つまり時刻 t1 から時刻 t2 と時間遷移する時系列で、コードを上下順に評価していった場
合、
時刻(t1)!Date.now()!(==t1)!
時刻(t2)!Date.now()!(==t2)!
となります。繰り返しですが、これは命令型のコードです。
この場合、
時刻(t1)において、 Date.now() を評価するのだから、返り値は(==t1)
時刻(t2)において、 Date.now() を評価するのだから、返り値は(==t2)
となって当然であり、論理整合に矛盾はありません(あたりまえ)
これをもって著者(や私)は、
Date.now()は「暗黙」に参照透過である、と論じています。
そしてもちろん、@Lambada とおぼしき人物が2ちゃんねるで主張する
92!:仕様書無しさん:2015/10/06(火)!11:47:58.55
Date.now()!(==t1)!
Date.now()!(==t2)!
(sub)expressionが同じなのに値が異なる。!
Sondergaard&Sestoft!1990,!p.!511の定義に従って、!
expression!"Date.now()"!は参照透明でない。!Q.E.D.!
というのは、明確に間違いです。
ここには一切、
時刻t1,t2の差異は数学的に明示しないまま、その差異を一切合切無視して、すべての時間
軸の物理世界において、
"Date.now()"が同じ値を返すのが参照透明、という誤った論証が展開されています。
Date.now()という関数は、ユーザの現実世界の現在時間依存の関数であり、
それぞれの時刻、つまりここでいう、t1,t2において参照透明です。
https://archive.is/r4i8e
115/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
Sondergaard&Sestoft 1990, p. 511の定義をひもときながら、
この「彼」が、値についてどう考えているか?というと、
92!:仕様書無しさん:2015/10/06(火)!11:47:58.55
Date.now()!(==t1)!
Date.now()!(==t2)!
(sub)expressionが同じなのに**値**が異なる。!
Sondergaard&Sestoft!1990,!p.!511の定義に従って、!
expression!"Date.now()"!は参照透明でない。!Q.E.D.!
というように、まさに、Reddyが批判するように、
関数型のプログラマは、これらの「値」はプログラミング言語の外ではなく内側に
存在していると考えているようですが、この点では、哲学者のみならず、プログラ
ミング言語の意味論の研究者たちとも全く異なっています
彼らは、これらの「値」は評価のプロセスを経て得られると考えているようです
という考え方をしています。
さらに、
意味不明なんですけど。!
あるexpressionにreferential!transparencyを保ちつつ時間に対応して!
異なった値を取らせたければ時間を表す引数がなければならないし、!
それがないならばreferentially!opaqueになるというだけのことなんだが。!
というように、「彼」は書いていることからも、
「参照透過」の値について、
言語外の「現在時刻」という値ではなく、
言語内の値であると考えていることが明瞭に読み取れるでしょう。
私は
というのは、明確に間違いです。
ここには一切、
時刻t1,t2の差異は数学的に明示しないまま、その差異を一切合切無視して、すべて
の時間軸の物理世界において、
"Date.now()"が同じ値を返すのが参照透明、という誤った論証が展開されています。
Date.now()という関数は、ユーザの現実世界の現在時間依存の関数であり、
それぞれの時刻、つまりここでいう、t1,t2において参照透明です。
というように書きました。すなわち、
Date.now() が参照する「値」とは、
言語外にしか存在し得ない「現在時刻」という数学的・観念的なオブジェクトであり、
「ユーザの現実世界の現在時間依存の」「それぞれの時刻」である。
これが、言語外の「値」ということです。
彼がやるように、命令型のフローとして、
言語外の「現在時刻」を参照する Date.now() をコード上に並べるのであれば、
「ユーザの現実世界の現在時間依存の」「それぞれの時刻」という「値」
を参照する Date.now() の「返り値」は、それぞれの時刻、つまりここでいう、t1,t2とな
https://archive.is/r4i8e
116/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
を参照する Date.now() の「返り値」は、それぞれの時刻、つまりここでいう、t1,t2とな
ります。
Date.now()
t1
t2
これらすべては、
同じ「現在時刻」という言語外の「値」を参照するexpressionであり、
同一指示の(coreferential)expressionとして交換可能である、のだから、
Date.now() は参照透過である、ということになります。
念の為ですが、
宣言型であるのならば、以下のコードは(理論的に)同時に評価されるので、
Date.now()!(==t1)!
Date.now()!(==t1)!
となります。
コードのフローでステップごとに評価時間が異なる命令型であるのならば、
時刻 t1 から時刻 t2 と時間遷移する時系列で、コードを上下順に評価していった場合、
時刻(t1)!Date.now()!(==t1)!
時刻(t2)!Date.now()!(==t2)!
と書いても、expresssion t1とt2を交換して、
時刻 t2 から時刻 t1 と時間遷移する時系列で、コードを上下順に評価していった場合、
時刻(t2)!Date.now()!(==t2)!
時刻(t1)!Date.now()!(==t1)!
と書いても、式/表現(expression)が意味するところはまったく変わらない、参照透過で
す。
@Lambada による追記脚注
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-8f454373d806047c7
a5e
にさらに(追記)があったので、こちらも追記して反論しておきます。
そして、この論文でも他の研究でもそうですが、純粋な関数型言語の表示的意味に
「現在時刻」や「状態」のような「暗黙の引数」は存在しません(プログラム上も
陽である「変数束縛」を表す「環境」はありますが、これは単一代入で、「現在時
刻」や「状態」のように値が変化したりしません。純粋でない関数型言語や命令型
言語ならば「状態」が存在しますが、それは岡部氏が著書で強く批判している
「x=x+1;」等と同じです)。
まず、ひとことばかり申し上げておきますが、私は@Lambadaによる「論文でも他の研究
でも・・・」
https://archive.is/r4i8e
117/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
でも・・・」
という言及については信頼していません。それは、今回も、
論文 http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf 511ペー
ジ
と参照透過の定義を紐解きながら、まったく「値」について真逆の論証を展開していたこ
とからも印象付けられます。
それを踏まえ、以上の@Lambadaの追記は事実と異なります。
まず、彼は、
純粋な関数型言語の表示的意味に「現在時刻」や「状態」のような「暗黙の引数」
は存在しません
などと書いていますが、事実と異なります。
純粋関数型であっても「モナド」という装置で「状態」をラッピングしているではないで
すか。
彼はReddyと同じ見解らしいですから、ふたたび、
http://qiita.com/knaka/items/b18134d9d11b51da4e2e
から引用します。
副作用を持つ C 言語の関数呼び出しさえも「状態を変更するもの」として定義
された「値」を持ち、それらの関数は、ある状態を、他の状態と値のペアへとマ
ップします(これは、関数型用語で言う「モナド」にあたります)
関数型言語のプログラマたちは、それら命令型言語を「参照透過」とは呼びたがら
ないでしょうから、そういった複雑な数学的・観念的オブジェクトを「値」である
と認めることも嫌がるでしょう。それでいてそれらの状態変換器が、彼らの好むと
ころの文法や「モナド」などというバズワードによって取り込まれるや、「値」と
呼ぶことに抵抗がなくなるようです。
これは、実際いろんな用語を駆使して論じるまでもなく、
純粋関数型言語であっても、「現在時刻」を画面に表示する「時計」アプリケーションを
書けます。
純粋な関数型言語の表示的意味に「現在時刻」・・は存在しません
であるならば、「時計」アプリすら書けないということになります。
実際「モナド」でラッピングして純粋関数型だ、と状態を隠 したことになっているだけ
です。
Q_Jirou
0 contribution
Nov 01, 2015 12:18
'Thank
@totemring さん、もう観念したらどうですか?
あなた、これまでにも、何度もアカウント削除処分にあって、それでも尚アカウントを取
り直してこうして現れるのは悪質ですよ。
https://archive.is/r4i8e
118/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
り直してこうして現れるのは悪質ですよ。
私が把握してるだけでも、4つのアカウントを止められてますよね。
その事実をもって、ご自分の非を疑えないというのは、ちょっと、おかしいですよ。
「おぼしき」と言い添えておけば、根拠の希薄な当てずっぽうの絡み方が赦されるわけで
はないですよ。科学的態度はもとより、人の道として、それはどうなのですか。よく考え
て行動なさい。
totemring
0 contribution
Nov 02, 2015 12:26
'Thank
@Lambada によるさらなる追記について、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-8f454373d806047c7
a5e
純粋な関数型言語のプログラム上でモナドを使うことはできますが、あくまで純関
数的な言語の中ですので、その意味論にモナドは不要で、「状態」や「暗黙の引
数」はありませんし、逆に「状態」を持つ命令型言語の意味論にモナドを用いるこ
ともできますが、その二つは同じ「モナド」の概念を利用していても別の話で
す)。
なんで純粋な関数型言語で「時計」プログラムが書けるのか?という矛盾は残ったままで
す。
意味論で、「現在時刻」という言語外の「値」を参照しないかぎり純粋関数型にしろ命令
型にしろ「時計」なんて書くのは絶対に無理なので。
keFun
0 contribution
Nov 02, 2015 13:20
'Thank
@Q_Jirou さん、お疲れさまです。
私はこれまでの一連の書き込みを見て、「根本的に議論が成り立たない相手」が存在する
という事実に脅威を覚えています(笑)
以前私が書き込んだ「参照透過性」の定義を読んだ後にまだ「Date.now() は参照透過であ
る」との主張を曲げないんですから、毛の人は根本的なところでの言語理解力が乏しい
か、私たちの言語体系とは違った世界の住人なのだと思うことにしました。
相手が人でない場合、「人の道」を説くの無意味だと思います。残念ながら…。
keFun
0 contribution
Nov 02, 2015 13:22
'Thank
@totemring
あなたはこれまでのコメントの中で何度も「コンセンサス」という言葉を使ってきていま
すが、あなたの「Date.now() は参照透過である」という主張はどの程度のコンセンサスが
得られているのですか?
もちろん、哲学や意味論や物理の世界ではなく、我々が議論している「関数型プログラミ
ング」の世界での話ですよ。
あなたがこれほど主張しているのですから、「関数型プログラミング」に関する学術論文
https://archive.is/r4i8e
119/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
の中に「Date.now() は参照透過である」と書かれている論文がさぞや沢山あるのでしょ
う。そのうち 4∼5 編でいいので題名と著者を教えてください。
「そんなのは自分たちで調べればいいだろう」などという『悪魔の証明』を提案しないで
くださいね(笑)
diff
0 contribution
Nov 02, 2015 13:54
'Thank
……まだDate.now()で消耗しているの?
totemring
0 contribution
Nov 02, 2015 14:46
'Thank
@keFun が
Date.now() がユーザーの現在時刻を元に値を返すなら、それは Date.now() がユーザ
ーの現在時刻を「参照」しているだけではないのですか?
もしかしたら、岡部氏や qiitapost さん、chimetorch さんは私たちとは違う次元に
住んでいて同じ言葉でも違う意味になるのかもしれませんね。
と書くものは、「値」が言語内にしか存在しない、と考えていればそれはもちろん「違う
次元に住んでいて同じ言葉でも違う意味になる」わけですが、
上記確認済みのように「値」が言語外にしか存在しない、と意味論的に正しい解釈をして
いれば、そんな間違った発想はでるわけがない。
さて、@Lambadaによる、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-8f454373d806047c7
a5e
にてさらなる追記がなさられたので論評します。
3.純粋な関数型言語のプログラム上でモナドを使うことはできますが、あくまで純
関数的な言語の中ですので、その意味論にモナドは不要で、「状態」や「暗黙の引
数」はありませんし、逆に「状態」を持つ命令型言語の意味論にモナドを用いるこ
ともできますが、その二つは同じ「モナド」の概念を利用していても別の話です。
1.2.3についてすでに論評しましたが、4は3の補足説明であるようです。
4.前者の場合、純粋な言語で表された関数等を、言語の外部の処理系が実際の「現
在時刻」等に適用して実行しますので、純粋でない言語と異なり、言語自体やその
上のプログラム(あるいはそれらの意味論)に「状態」や「暗黙の引数」は存在せ
ず、副作用がない純粋な数式のように扱うことが可能となります。例えば整数を返
すJavaScriptのDate.now()と異なり、HaskellのgetCurrentTimeは、整数や特定の時
刻を表す文字列等を返す関数ではなく、IOアクションです(後者は関数ですらな
く、単なる一つの値であることに注意してください)。
そのIOアクションは特定の時刻を表す整数等ではなく、「現在時刻を取得する」と
いう動作を表す値に過ぎませんので、それ自体は副作用も「暗黙の引数」もなく、
https://archive.is/r4i8e
120/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
時刻によって値が変わったりはしません。これは確かに初学者が混乱しやすいとこ
ろではありますが、Haskell等のモナドの基本中の基本です(IOアクションが「動作
を表す値」に過ぎないことを理解していないと、第一級値としてリストの要素や関
数の引数や戻り値になりうることが理解できません)。
以上の@Lambadaによる主張は間違いです。どこが間違っているのか?
まず、根本的に彼や@nonstarterらが勘違いしているのは、
参照透過も関数型の概念も「プログラミング言語」によって規定する・されるものではあ
りません。
JavaScriptは「純粋関数型言語」ではないので、<あるJavaScriptコード>に参照透過と
いう概念が適用されないのか?
そんなわけはありません。
よって、このように、「言語」によって場合分けしている、JavaScriptならばこうだ、
Haskellならばこうだ、と論じるのは参照透過の議論、
あるいは、JavaScriptのDate.now()とHaskellのgetCurrentTimeを概念的に比較するのは極
めて不適切であり、間違っています。
例えば整数を返すJavaScriptのDate.now()と異なり
などと書いていますが、
例えば整数を返す(純粋関数型言語でない)JavaScript(だから)(その純粋関数ではな
い)Date.now()と異なり、
などという論法が根本的に誤りです。
以下正しい論証を書きます。
これまで何度も確認したとおり、
JavaScriptのDate.now()が参照する「値」とは、「整数」では断じてありません。
言語がなんであれ、純粋関数型言語であろうがなんであろうが、
JavaScriptのDate.now()が参照する「値」とは、あくまで言語外の「現在時刻」です。
それが意味論における「値」でした。
プログラムのある実行時T1に評価されるDate.now()の「値」とは
プログラムのある実行時T1における「現在時刻」であり、
それは例えば、ある整数のexpressionという返り値として得られます。
プログラムのある実行時T2に評価されるDate.now()の「値」とは
プログラムのある実行時T2における「現在時刻」であり、
それは例えば、ある整数のexpressionという返り値として得られます。
Date.now()
T1
T2
ある整数
これらすべては、
https://archive.is/r4i8e
121/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
これらすべては、
同じ「現在時刻」という言語外の「値」を参照するexpressionであり、
同一指示の(coreferential)expressionとして交換可能である、のだから、
Date.now()は参照透過である、ということになります。
ここで、「ある整数」と「別の整数」が交換可能なわけがない!って思うのでしょう?
だからそれは、そもそも、「あなた」が、
コードのフローでステップごとに評価時間が異なる命令型のコードとして、
時刻T1から時刻T2と時間遷移する時系列で、コードを上下順に評価していった場合、
時刻(T1) Date.now() (==T1) ある整数
時刻(T2) Date.now() (==T2) 別の整数
としてコードを書いたからです。
Date.now()自体は参照透過ですが、
var!T1!=!Date.now()
var!T2!=!Date.now()
というコードを書けば、これは命令型フローとしてJS実行環境は解釈実行するので、
T1とT2の変数値(JSでは整数)は異なります。(「値」はそれぞれの「現在時刻」なので同
じ)。
T1とT2の整数が異なるからといって、言語外にしか存在し得ない「値」=現在時刻が異な
るわけではありません。
参照透過の意味論の定義では、
言語内のT1とT2の変数値(整数)が異なる、というから参照透過ではない
(これが@Lambadaと@nonstarterが一貫して展開していた間違った議論、説明済み)
ということではありえず、
それぞれの「現在時刻」という抽象概念=言語外の「値」を同一指示しているので、参照
透過です。
Date.now()が参照透過なのはわかった。
では、
var!T1!=!Date.now()
var!T2!=!Date.now()
このように上下に並べただけで、自動的に命令型フローになっちゃうJavaScriptの仕様は
困る。
そう考えたならば、
var!IOaction!=!()=>{Date.now()};
このように関数でラッピングしてやればよろしい。
これは、「現在時刻を取得するという動作を表す値」を参照するexpessionとしての
JavaScriptの関数です。
80%
こうすれば、JavaScript関数、IOactionを上下に並べようと、それは命令型コードのフロ
ーとして、
https://archive.is/r4i8e
122/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
実行環境に解釈実行されていまうこともありません、
そして、この、
var IOaction = ()=>{Date.now()};
という、JavaScript関数を、
Haskellでは、
「現在時刻を取得するという動作を表す値」に過ぎないIOアクションgetCurrentTime
と呼ぶことにしているのが「モナド」にすぎません。
それでですね。
Date.now()を関数でラッピングすれば、命令型としてコードの上下フローとして逐次解釈
実行されることもなくなる、っていうのは、
意味論、とも、
参照透過の定義、とも、
なんの関係もありません。
繰り返しますが、
Date.now()
T1
T2
ある整数
これらすべては、
同じ「現在時刻」という言語外の「値」を参照するexpressionであり、
同一指示の(coreferential)expressionとして交換可能である、のだから、
Date.now()は参照透過である、ということになります。
@Lambada は、
「現在時刻を取得するという動作を表す値」というIOアクションは、「モナド」というバ
ズワードにラッピングされているので、
意味論の「値」としては認めれる。
しかし、
純粋な関数型言語の表示的意味に「現在時刻」や「状態」のような「暗黙の引数」
は存在しません
「現在時刻」自体は、状態そのものなので、意味論の「値」としては認められない、
おおよそこんなことを主張しているわけです。
@Lambadaは、
意味論において、
『「意味論の値として認められないもの」を取得するという動作』は、意味論の値として
https://archive.is/r4i8e
123/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
認める!
とか主張しているわけです。
これは「誤魔化し」であり「錯覚」なんですね。
いったいこんな珍妙な「意味論」の定義はどこにになされているのでしょうか? 『「意味論の値として認められないもの」を取得するという動作』によって取得できた
「値」とは、
もちろん
「意味論の値として認められないもの」なのですから、意味論の範疇には入らないんです
よね??
Haskellで「意味論の値として認められないもの」を表示する時計を書けるのはなぜです
か?
keFun
0 contribution
Nov 02, 2015 15:25
'Thank
@totemring さん、コンセンサスの話題はスルーですか?(笑)
上記確認済みのように「値」が言語外にしか存在しない、と意味論的に正しい解釈
をしていれば、そんな間違った発想はでるわけがない。
私はあくまでも「関数型プログラミング」の範疇で話をしているので、言語内の値の話を
してますよ。
哲学の話や意味論の話は聞き飽きました。「関数型プログラミング」における「参照透過
性」の話をしてください。
私の書き込んでいる「日本語」が理解できますか?
まあ、自分が不利になると話題をすりかえるのはいつものことなので、まともに答えても
らえるとも思ってませんが…。
keFun
0 contribution
Nov 02, 2015 16:03
'Thank
@totemring さん、私は @Lambada さんの話はしてません。
「関数型プログラミング」の話をしています。それについての答えを聞かせてください。
あなたの主張のコンセンサスについての返事はまだですか?
totemring
0 contribution
Nov 02, 2015 16:04
'Thank
@keFun
私はあくまでも「関数型プログラミング」の範疇で話をしているので、言語内の値
の話をしてますよ。
哲学の話や意味論の話は聞き飽きました。「関数型プログラミング」における「参
https://archive.is/r4i8e
124/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
哲学の話や意味論の話は聞き飽きました。「関数型プログラミング」における「参
照透過性」の話をしてください。
ということですが、関数型プログラミングjの議論
「参照透過である」とは、何から何への参照がどういう条件を満たすことを言うのかの延
長で論証しています。
読んでも居ないあなたに聞き飽きたとか言われる筋合いもないのだし、横槍を入れるだけ
なのは迷惑なんですね。
@Lambada もあなたと同様に、「言語内の値」の話をしていましたが、
その記事においてReddyが「関数型プログラミング」の範疇で「参照透過」の話をしてお
り、値とは言語外にしか存在しないと認識した途端、それに同意すると言いだして、言語
外の値の話をしていると意見を変えました。
あなたの主張のコンセンサスについての返事はまだですか?
もちろんスルーします。
なぜならば、上記記事できちんと論証済みだからです。
keFun
Nov 02, 2015 16:13
'Thank
0 contribution
@totemring さん、あなたの主張のコンセンサスに関してはまったく論証などされてませ
んよ。
返事に困ると「すでに論証済み」というのはやめてください。
「上記記事」とは取りとめもなくダラダラと文字を連ねているだけのコメントのことです
か?あれのどこに「論証」が含まれているのですか?まさか他の人がまったく認めていな
いことでも、自分の主張を書いただけで「論証」したことになると思ってるんですか?
「参照透過性」の前に「論証」についての議論から始めなければならないのでしょうか?
totemring
Nov 02, 2015 16:35
'Thank
0 contribution
@keFun = 「毛ファン」
「毛の壁ファンクラブ」なる著者を中傷
謗する、2ちゃんねるスレッドからのこれみよ
がしのHN。
そして"手癖の悪い"あなたが、このコメント欄に書く目的は、Q次郎、ビースト田所その
他同様、横槍を入れて、
コメント欄の議論とまったく無関係な方向への「炎上」を狙うためです。
先に書いておきますが、Q次郎、ビースト田所同様、白々しい「否定」につきあうつもり
はありません。
別に否定しても構いませんが、読者の印象に委ねます。
まさか他の人がまったく認めていないことでも、自分の主張を書いただけで「論
証」したことになると思ってるんですか?
https://archive.is/r4i8e
125/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
「他の人」などと一般化して中傷していますが、読める読めないはあなたの主観でしょ
う。
次に、このコメント欄のコメントを「記事」などとは言いません。
上記記事とは、
関数型プログラミングの議論
「参照透過である」とは、何から何への参照がどういう条件を満たすことを言うのか
です。
keFun
0 contribution
Nov 02, 2015 17:37
'Thank
@totemring
なんだ。あなたが自分で論証したコメントがどこかにあると思ってしまいました。
だいたい、「参照透過である」とは、何から何への参照がどういう条件を満たすことを言
うのかのどこをどう読んで曲解すれば「Date.now() は参照透過である」というあなたの主
張の論証になるのですか?
本当に論証されたのなら、既に抹消処分になってしまった"手癖の悪い"あなたのソックパ
ペットたち以外にも賛同者が出てきても良さそうですが。
totemring
0 contribution
Nov 02, 2015 17:39
'Thank
@Lambadaによる、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-8f454373d806047c7
a5e
の度重なる追記
(なお、totemring氏は私が言を変えたかのように主張されているので念のため、
Reddy氏が論じている命令型言語と異なり、純粋な関数型言語はまさに「状態」や
「暗黙の引数」がないため、言語内でも式の値を表せます)
前者の場合、純粋な言語で表された関数等を、言語の外部の処理系が実際の「現在
時刻」等に適用して実行しますので、純粋でない言語と異なり、言語自体やその上
のプログラム(あるいはそれらの意味論)に「状態」や「暗黙の引数」は存在せ
ず、副作用がない数式のように扱うことが可能となります。
というのを読んでいるのですが、彼は、
論文 http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf 511ペー
ジにある参照透明(purely referential)の定義
をもって、
まさにReddy氏の言う言語の外の表示(denotation)(=「値」)です
https://archive.is/r4i8e
126/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
と書いています。(しかしこれまで言語内の「値」でしか議論していなかったことは何度
も確認しました。)
そして彼はこう続けます。
そして、この論文でも他の研究でもそうですが、純粋な関数型言語の表示的意味に
「現在時刻」や「状態」のような「暗黙の引数」は存在しません
ここはまったく意味不明で、言語外の「値」(referent/denotation)であるならば、当然「現
在時刻」も「状態」もその数学的・観念的オブジェクトの参照対象となるのに、そういう
のが存在しませんと断じている。
これは、おそらく各種論文を読んだ時に、彼の不理解によってそういう「思い込み」が発
生してたとしか判断のしようがありません。
さらっと、「純粋な関数型言語の表示的意味」と、ここで彼が勝手に「純粋な関数型言語
の」と範囲限定しているのですが、これは詭弁です。
直前までは、
まさにReddy氏の言う言語の外の表示(denotation)(=「値」)です
とReddyが「参照透過」そして「値」という用語について、意味論における歴史的経緯と
コンセンサスを示し、@Lambadaはそれと同じ理解だ、であり、「言語外の値」という理
解を強調していたのに、その直後、
(なお、totemring氏は私が言を変えたかのように主張されているので念のため、
Reddy氏が論じている命令型言語と異なり、純粋な関数型言語はまさに「状態」や
「暗黙の引数」がないため、言語内でも式の値を表せます)
1 Reddy氏が論じている命令型言語と異なり、純粋な関数型言語は、とReddyと異なる
立場を突然表明
2 「純粋な関数型言語の」と範囲限定してしまった。
3 言語内でも式の値を表せます
と、立論中、対立した立場を強調し、中途でまた「値」の意義をひっくりかえしてしまい
ました。
前者の場合、純粋な言語で表された関数等を、言語の外部の処理系が実際の「現在
時刻」等に適用して実行しますので、純粋でない言語と異なり、言語自体やその上
のプログラム(あるいはそれらの意味論)に「状態」や「暗黙の引数」は存在せ
ず、副作用がない数式のように扱うことが可能となります。
やはり「純粋関数型言語」は「数式」であると。はいよくわかりますよ。
まさにそれは、Reddyが従来の「値」「参照透過」の用語の定義とは違う、と批判してい
たものです。
関数型言語のプログラマによる参照透過に関する考え方は、以下の 3 点において、
標準的な参照透過の概念と異なっているようです。
https://archive.is/r4i8e
127/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
標準的な参照透過の概念と異なっているようです。
哲学者や論理学者は用語として「reference(参照)」「denotation(明示的な意
味)」「designatum(指示されるもの)」「bedeutung(Frege が用いるドイツ
語の用語)」などを用いるのですが、関数型のプログラマは「値(value)」を
用います(これは関数型のプログラマに限った話ではなく、ランディンやストレ
イチーとその後継者達も “reference” や “denotation” の意味で「値」を用いてい
ます(訳注: ピーター・ランディン
Peter Landin - Wikipedia, the free encyclop
edia)。これはどうやら、単なる用語の簡略化であり、ランディンやストレイチ
ーが導入したもののようなのですが、厳密な議論の際にはそれらは大きな違いに
なり得ますので、注意を要します)
関数型のプログラマは、これらの「値」はプログラミング言語の外ではなく内側
に存在していると考えているようですが、この点では、哲学者のみならず、プロ
グラミング言語の意味論の研究者たちとも全く異なっています
彼らは、これらの「値」は評価のプロセスを経て得られると考えているようです
たとえば、今朝の時点の Wikipedia の「参照透過」に関する項目を見てみると、そ
こには下記のような記述があります。
式は、プログラムの挙動を変えることなしに、その式をその値と置換するこ
とが可能であるならば(言い換えると、同じ入力に対して、同様の効果と出
力をするプログラムを生成することができるならば)、その式は参照透過で
あると言える。
これは、哲学者や論理学者が言うところとは、全く相容れません。哲学者・論理学
者の考え方では、あるコンテキストが参照透過であるということは、そのコンテキ
スト内のある expression が、それと同一の実体を指す expression(同一指示の
(coreferential)expression)と交換可能であることを言うのです。ここで言う「哲
学者」や「論理学者」とは誰かですって? それはフレゲでありラッセルでありホワ
イトヘッドであり、カーナップ、クワイン、チャーチ他、数え切れないほどのその
他大勢のことです。どの一人を取っても、ハンパない大人物たちであり、彼ら論理
学者の知性の力を統合すれば、地球を壊滅させるに値するほどの偉人達です。彼ら
は、一つの点については意見を一致させます、「referent・denotation は形式言語の
外側に存在し、言語内の expression は、それらに対して言及することしかできな
い」と。つまりは、人が言語を用いて出来ることというのはせいぜい、一つの
expression を、それと同一の実体を指し示す他の expression に入れ替える程度のこ
とだということです。referent・denotation そのものは、言語内には存在しないので
す。しかし、だとするならばなぜに関数型のプログラマたちは、こうも古くから確
立された考え方から逸脱した捉え方をしているのでしょうか?
私が要約すると、
そもそもの、従来の意味論における「参照透過」とは、
1.値referent・denotation そのものは、形式言語の外側に存在する
2.言語内の式expression は、その値referent・denotationを参照(指示)する
3.同一の値referent・denotationを参照(指示)する言語内の式expressionは交換可能で
あり、それが参照透過である
ということです。
https://archive.is/r4i8e
128/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
ということです。
上記の従来の意味論における「参照透過」の概念、
形式言語の外側に存在する値referent・denotationを考えずに、
コードの評価のプロセスからのみ得られる、算術の値、
つまり@Lambadaが言っている、
副作用がない数式のように扱うことが可能となります
言語内でも式の値を表せます
とか言ってるほうの「それ」のことですが、
「それ」は、上記の従来の意味論における「参照透過」の概念の「部分集合」としては成
立する、ということになります。
そして、問題はほとんどすべての関数型プログラマは @Lambadaのようにそれが本来の意
味論における「参照透過」の「部分集合」にすぎない、という自覚がなく、それが「すべ
て」だ、数式上で交換可能なものこそが「参照透過」である、と勘違いしていることだ、
というのが、Reddyによる批判の骨子です。
参照透過、値とは、そのような部分集合ではそもそもない、ということです。
だからこそ命令型にも参照透過の概念は適用できると。
私が言うDate.now()とは、従来の意味論において、紛れもなく参照透過ですが、
@Lambada は言うに事欠いて、よりによって、上記の従来の意味論における「参照透過」
の概念ではないほうの、
副作用がない数式のように扱うことが可能
な純粋関数型としての部分集合にあてはまらない、というのが気に入らないようです。
前者の場合、純粋な言語で表された関数等を、言語の外部の処理系が実際の「現在
時刻」等に適用して実行しますので、純粋でない言語と異なり、言語自体やその上
のプログラム(あるいはそれらの意味論)に「状態」や「暗黙の引数」は存在せ
ず、副作用がない数式のように扱うことが可能となります。例えば整数を返す
JavaScriptのDate.now()と異なり、HaskellのgetCurrentTimeは、整数や特定の時刻
を表す文字列等を返す関数ではなく、IOアクションです
という、IOActionをもって、Date.now()が参照透過でない、と否定するのは不可能です
し、間違いです。
念の為ですが、
JavaScriptで、Date.now()について、
var!IOaction!=!()=>{Date.now()};
とIOアクション化しても、しなくても、たとえば、任意のイベントに紐付ければ同じこと
なので、
明示的にラッピングしなくても、Date.now()自体は参照透過なのだから、数式上 褄の合
https://archive.is/r4i8e
129/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
うJavaScriptのコードは書けます。
ただ不用意に
var!t1=Date.now();
var!t2=Date.now();
とならべれば命令型のフローとして、異なる時刻で評価されるので、
そのコード(expression)が単一時刻内の論理体系ととらえた場合、論理的に不整合にな
りよろしくない、ということです。
そして、コード(expression)が単一時刻内の論理体系ととらえた場合、論理的に不整合
になりよろしくないという事実と、
var!t1=Date.now(); (時刻t1における現在時刻の評価!なのだから参照透過)
var!t2=Date.now(); (時刻t2における現在時刻の評価!なのだから参照透過)
という従来意味論における参照透過性は、まるで別問題です。Reddyが命令型であっても
従来意味論において、参照透過の概念は成り立つ、と言ってることです。
さらなる @Lambada による追記
「x=x+1;」のような命令型プログラムを(ご自身では理解されていないかもしれま
せんが)純粋な数式や関数型言語の意味論にもとづいて「論理破綻」と批判し、関
数型プログラミングの話をしていたのではなかったのでしょうか。まさに関数型言
語の意味論でDate.nowが参照透明でないから「Date.now()==Date.now()」が一般に
は成り立たない、という「論理破綻」は良いのでしょうか。
について論評します。
x!=!x!+!1;
というコードは、
時刻@右辺 の x
時刻@左辺 の x
という『フロー』が存在する命令型のコードです。
前述の通り、単一時刻内の論理体系ととらえた場合、論理的に不整合になりよろしくな
い、
「論理破綻」しているという批判になります。
これは「任意の単一時刻」で成立する宣言型、関数型のコードではありません。
また、特に、@nonstarterがこの記事において、著書内の「右辺左辺」にまつわる言及に
ついて批判的なレビューをしていましたが、Reddy氏が紹介するこの式の左辺右辺要素と
著書の言及はまったく同一要素を論述しているということなるでしょう。
同様に、
「Date.now()==Date.now()」が一般には成り立たない
これはES5/6などの言語仕様において特別に規定されているのかどうか知りませんが、
https://archive.is/r4i8e
130/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
これはES5/6などの言語仕様において特別に規定されているのかどうか知りませんが、
各種Javascriptエンジンで実際どのように実装されていて、評価されるのか?という問題
と、
Date.now()
T1
T2
ある整数
これらすべては、
同じ「現在時刻」という言語外の「値」を参照するexpressionであり、
同一指示の(coreferential)expressionとして交換可能である、のだから、
Date.now()は参照透過である、という議論とは無関係です。
(命令型であっても参照透過という概念は成り立つというのと一緒)
著者を個人攻撃する2ちゃんねるのネタばっかり持ちだして誤魔化しなさんな。
@Lambada の主張はすでに支離滅裂といって良いレベルに混迷しており、今一度自身で
整理することをおすすめします。
86Kazoo
Nov 02, 2015 21:47
'Thank
0 contribution
@totemringさん、もういい加減にしませんか?
2ちゃんねるでの出来事を引っ張ってきて、話をこじつけ、ご自分の不都合な状況の打開
とする癖はおやめになった方が良いでしょうし、そしてここでは謹むべきです。
結局、KeFunさんがおっしゃる”「関数型プログラミング」に関する学術論文の中に
「Date.now() は参照透過である」と書かれている論文”は何一つ提示できないことが不都
合だから、「陰謀」のせいにして取り合わないというポーズをとられているだけじゃない
ですか。
言い方は悪いですが、それではまるでエセ科学者と同じです。
あなた、これまでにも管理者処分を食らっても、アカウントをとっかえひっかえして投稿
を続けてますけど、そんなことして恥ずかしくないのですか?
ユーザーに迷惑がかかっているから処分されてきたんですよ? なんでそれがわからないんですか?
totemring
Nov 03, 2015 03:35
'Thank
0 contribution
しつこいので「迷惑行為」について私の見解を再掲します。
ここでの一番の問題は、@86Kazooその他のように、あたかも技術的トピックに興味があ
る勉強しにきているという公正中立な立場を装いながら、まるで議論に関与せず(でき
ず)、その主たる目的はあくまで著者を中傷
謗する、いわば炎上のマッチポンプの役割
を果たしたい固定された面子の横槍コメントが横行していることです。
なぜこのような事がこの記事に起こるのか?というと、とりもなおさず上述のとおり、公
正中立に見せかけた @Lambada @nonstarter はじめ、当該2ちゃんねるスレッドとリン
クしながら展開するこの「キャンペーン」に便乗参加しているからだ、ということになり
ます。
言うまでもありませんが、Qiitaはそれこそ「客観的」な技術的情報を共有するサイトであ
り、特定個人への攻撃や、著書をネガティブキャンペーンする場ではありません。
本記事はそもそもが主観的なレビューではありますが、Qiitaにおいて存在を許容されてい
るのは、それがあくまで規約に則った社会的利害に沿うものであるという大前提があると
https://archive.is/r4i8e
131/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
考えます。当方が説明した以上のような状況は明らかにサイトの理念と規約に反してお
り、そのことをここで共有して注意喚起を促したいと考えています。
技術論そのものについては、一連の固定化した否定ありきの特定の面子ではなく、広い読
者は自分の頭でその是非を判断できるのだから、横槍で何をどう印象操作しようとも無駄
です。
またしつこいので念の為に書いておくと、
”「関数型プログラミング」に関する学術論文の中に「Date.now() は参照透過である」と
書かれている論文”
についてですが、
「関数型プログラミング」に関する学術論文の中に「Date.now() は参照透過ではない」と
書かれている論文も、一切提示されていません。
@Lambada は、せいぜい、
92!:仕様書無しさん:2015/10/06(火)!11:47:58.55
Date.now()!(==t1)!
Date.now()!(==t2)!
(sub)expressionが同じなのに値が異なる。!
Sondergaard&Sestoft!1990,!p.!511の定義に従って、!
expression!"Date.now()"!は参照透明でない。!Q.E.D.!
どの論文にも、"Date.now()" は参照透明でない。 Q.E.D. なんてことは書かれていない
が、
こういう「値」について言語内のプロセスによって得られる算術の言語内の「値」という
解釈、つまりReddyが批判するとおりの間違った論旨の主張をしているに過ぎません。
ここで、私が
「参照透過である」とは、何から何への参照がどういう条件を満たすことを言うのかで示
されるReddyによる論証、批判を挙げると、
@Lambada は、
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-8f454373d806047c7
a5e
P.S. 下のほうでtotemring氏が参照されているReddy氏のコメントは私が挙げたよう
な査読論文ではありませんが、氏が述べている参照透明性は、私が挙げた査読論文
の定義と一致します1。また、氏が挙げているQuineやStrachyの論文を見ても、大
まかに言うと「文の一部をその値(参照する対象)で置き換えても全体の意味は変
わらない」という、私やnonstarter氏が用いている参照透明性の定義と一致します。
と@Lambadaは彼の論証と一致するという立場を表明した。これには正直ちょっと驚きま
した。
なぜならば、Reddyの批判するものとはまさに@Lambadaのような考え方だからです。
また、これからどう
褄合わせするつもりなんだろう?と興味深くもありました。
しかし、ようやく意見が一致するボトムラインが発見されたわけです。
褄合わせの第一段階として、まず彼は、
Sondergaard&Sestoft 1990, p. 511の定義は、
Reddyのいう意味論での言語外で間違いないと、これまでの主張を一転させ解釈を変え
た。
https://archive.is/r4i8e
132/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
論文 http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf 511ペー
ジにある参照透明(purely referential)の定義e1 = e2
e[e1/p] = e[e2/p]における=
は、510ページで表示的意味(denotational semantics) Dにより定義されているので、
まさにReddy氏の言う言語の外の表示(denotation)です(実際、この論文の対象言語
の表示的意味は集合で定義されている一方、言語自体の中に集合の式の構文はあり
ません)。
わけがわからないので、
Reddyの見解と一致するとする彼がこれまであげた論文、意味論を彼がどう解釈している
か?精査して、私が批判すると、
今度は私が直近のコメント
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-83a7638e306b027c8
f28
で分析したように、今度は勝手に「純粋関数型」に範囲を限定して、
そして、この論文でも他の研究でもそうですが、純粋な関数型言語の表示的意味に
「現在時刻」や「状態」のような「暗黙の引数」は存在しません
(なお、totemring氏は私が言を変えたかのように主張されているので念のため、
Reddy氏が論じている命令型言語と異なり、純粋な関数型言語はまさに「状態」や
「暗黙の引数」がないため、言語内でも式の値を表せます)
前者の場合、純粋な言語で表された関数等を、言語の外部の処理系が実際の「現在
時刻」等に適用して実行しますので、純粋でない言語と異なり、言語自体やその上
のプログラム(あるいはそれらの意味論)に「状態」や「暗黙の引数」は存在せ
ず、副作用がない数式のように扱うことが可能となります。
などと、とってつけたように追記し、
Reddy氏が論じている命令型言語と異なり、純粋な関数型言語はまさに
Reddyのいう従来意味論の話ではない、とちゃぶ台返ししたうえで、
むしろ批判する文脈での、純粋な関数型言語で関数型プログラマが考える「値」のこと
だ、といきなり範囲限定し、
副作用がない数式のように扱うことが可能となります
言語内でも式の値を表せます
などと、また意見を変える前の「値」は言語内の主張をしはじめた。
支離滅裂です。
@Lamnabdaにの主張が混迷しているということは、Reddyの論証に目を通したうえで、 @
Lamnabdaによる議論を
ることが出来るならば、誰でも確認できることです。
しかしその路線で反論もできない一定の連中があいもかわらず無関係な横やりだけ入れて
https://archive.is/r4i8e
133/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
しかしその路線で反論もできない一定の連中があいもかわらず無関係な横やりだけ入れて
きて迷惑であるということです。いくら技術論における反論にまったく足りていない、本
論と無関係のコメント欄の炎上を狙う姑息な横槍を入れても、無駄だと思いますが。
なお重要な補足ですが、
4.前者の場合、純粋な言語で表された関数等を、言語の外部の処理系が実際の「現
在時刻」等に適用して実行しますので、純粋でない言語と異なり、言語自体やその
上のプログラム(あるいはそれらの意味論)に「状態」や「暗黙の引数」は存在せ
ず、副作用がない純粋な数式のように扱うことが可能となります。例えば整数を返
すJavaScriptのDate.now()と異なり、HaskellのgetCurrentTimeは、整数や特定の時
刻を表す文字列等を返す関数ではなく、IOアクションです(後者は関数ですらな
く、単なる一つの値であることに注意してください)。
そのIOアクションは特定の時刻を表す整数等ではなく、「現在時刻を取得する」と
いう動作を表す値に過ぎませんので、それ自体は副作用も「暗黙の引数」もなく、
時刻によって値が変わったりはしません。これは確かに初学者が混乱しやすいとこ
ろではありますが、Haskell等のモナドの基本中の基本です(IOアクションが「動作
を表す値」に過ぎないことを理解していないと、第一級値としてリストの要素や関
数の引数や戻り値になりうることが理解できません)。
という@Lambadaの間違った主張について、
var IOaction = ()=>{Date.now()};
という事を書いているに過ぎず、意味論、参照透過性の定義とは関係ない、という指摘を
しましたが、
var IOaction = Date.now;
と書いても同じです。
var!IOaction!=!Date.now;
console.log(IOaction);
now() { [native code] }
したがって私がこう書き直すこともできます:
JavaScriptのDate.nowは、特定の時刻を表す整数や文字列等を表す関数ではなく、IOア
クションです。
(これは関数であり、単なる一つのファーストクラスオブジェクトを参照する意味論にお
ける言語外の「値」であることに注意してください)。
そのIOアクション(JavaScriptのDate.now)は特定の時刻を表す整数等ではなく、
「現在時刻を取得する」という動作を表す値に過ぎませんので、それ自体は副作用も「暗
黙の引数」もなく、時刻によって値が変わったりはしません。
これは確かに初学者が混乱しやすいところではありますが、Haskell等のモナドの基本で
あるIOアクションが「動作を表す値」に過ぎないことを理解している必要すらなく、
https://archive.is/r4i8e
134/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
あるIOアクションが「動作を表す値」に過ぎないことを理解している必要すらなく、
Date.nowという関数が第一級値(ファーストクラスオブジェクト)としてリストの要素
や関数の引数や戻り値になりうることは関数型言語の必要条件にすぎません。
と、いうように、なんのことはない、
同じ「現在時刻を取得する」という動作を表す値について、
JavaScriptのDate.now関数ならば、参照透過な値として認められない、
Haskellその他のモナド、IOアクションという「なまえ」で理解したら、それは参照透過
な値として認める、
という欺瞞、誤魔化しなのですが、あるいはその自覚がない故に、単に理解不足で誤解し
てしまっているのでしょう。
これがまさに、Reddyが批判する、
関数型言語のプログラマたちは、それら命令型言語を「参照透過」とは呼びたがら
ないでしょうから、そういった複雑な数学的・観念的オブジェクトを「値」である
と認めることも嫌がるでしょう。それでいてそれらの状態変換器が、彼らの好むと
ころの文法や「モナド」などというバズワードによって取り込まれるや、「値」と
呼ぶことに抵抗がなくなるようです。この姿勢は一貫性に欠くではないかと言わざ
るを得ません。たとえ彼らの「参照透過」の考え方にある程度の統一性が認められ
たとしてもです。
ということです。
86Kazoo
0 contribution
Nov 03, 2015 09:19
'Thank
@totemring 聞き捨てなりませんね。一体どう云う了見で、立場を装うだのなんだので、
私が中傷
謗していると言うのですか? それこそが 謗中傷ではないですか。
私はあなたが以前開き直ったような、「捨てアカウント」ではないし、一技術屋として勉
強している身です。
Qiitaの参加方法は人それぞれです。自分が出来る限りの方法で参加するのは当然じゃない
ですか。
おまけにまだ2ちゃんねるがどうとか言うのですか。キャンペーンてなんなんですか。
あなた、それだけ言うからには、証明責任があると思うのですが、証明、しましょうよ。
そこに「陰謀」があるというからには、あることの証明が必要ですし、証明責任がありま
す。
義務を何一つ果たさずに、2ちゃんねるのログを勝手に引っ張ってきてあーだこーだと言
っても、そんなの、チンピラのインネンと同じじゃないですか。それは科学的態度と言え
るのですか。
結局、KeFunさんがおっしゃる”「関数型プログラミング」に関する学術論文の中に
「Date.now() は参照透過である」と書かれている論文”は何一つ提示できないってことは
認めるんですね?
totemring
0 contribution
Nov 03, 2015 09:55
'Thank
@86Kazoo
https://archive.is/r4i8e
135/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
@86Kazoo
私はあなたが以前開き直ったような、「捨てアカウント」ではないし
これなんですか?
あなた、それだけ言うからには、証明責任があると思うのですが、証明、しましょうよ。
そこに「陰謀」があるというからには、あることの証明が必要ですし、証明責任がありま
す。
そんなの、チンピラのインネンと同じじゃないですか。それは科学的態度と言えるのです
か。
2ちゃんねるのログを勝手に引っ張ってきてあーだこーだと言っても、そんなの、
チンピラのインネンと同じじゃないですか。それは科学的態度と言えるのですか。
http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-d9289fc58832c1409
dac
とか、
@Lambada とまったく同じことを数分違いのポストで書き込みがあるとか、その他諸々
ありますが、ここに頻出している固定のメンツが「2ちゃんねるで書き込んでいるのは自
分です」と書き込むはずもなし、せいぜい2チャンネルスレッドの 謗中傷HNと同一の
HNをここでも出してその面子と同一だとアピールしながら白々しい嘘をついて「kefunさ
んお疲れ様です」などと連携の態度もアピールする程度でしょう。
結局、KeFunさんがおっしゃる”「関数型プログラミング」に関する学術論文の中に
「Date.now() は参照透過である」と書かれている論文”は何一つ提示できないってこ
とは認めるんですね?
もう書いたんですが、
またしつこいので念の為に書いておくと、
”「関数型プログラミング」に関する学術論文の中に「Date.now() は参照透過である」と
書かれている論文”
についてですが、
「関数型プログラミング」に関する学術論文の中に「Date.now() は参照透過ではない」と
書かれている論文も、一切提示されていません。
@Lambada は、せいぜい、
92!:仕様書無しさん:2015/10/06(火)!11:47:58.55
Date.now()!(==t1)!
Date.now()!(==t2)!
(sub)expressionが同じなのに値が異なる。!
Sondergaard&Sestoft!1990,!p.!511の定義に従って、!
expression!"Date.now()"!は参照透明でない。!Q.E.D.!
というので、
”「関数型プログラミング」に関する学術論文の中に「Date.now() は参照透過ではない」
と書かれている論文”
と主張しているようなので、その解釈と論法が間違いであるという説明を繰り返しここで
したので、
https://archive.is/r4i8e
136/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
Sondergaard&Sestoft 1990, p. 511の定義に従って、
同じ「現在時刻」という言語外の「値」を参照するexpressionであり、
同一指示の(coreferential)expressionとして交換可能である、のだから、
expression "Date.now()" は参照透明である。 Q.E.D.
で良い、ということになります。
あるいは、同じ論文の同じ定義に従って、
Haskell等のモナドのIOAction、 getCurrentTime とは、
「現在時刻を取得する」という動作を表す値であり、参照透過である。
同様に、JavaScriptの関数 Date.now とは、
「現在時刻を取得する」という動作を表す値であり、参照透過である。
SonshiKaruma
0 contribution
Nov 03, 2015 10:17
'Thank
@totemring 子供じみたオウム返しなんかでごまかして、恥ずかしいと思わないの?質問
に、答えられない悔しさ、あたし、わかる。だけど、いい加減に大人の態度見せてくださ
い。
それに、その人たちが2chに書き込みをしていたら、いけないわけではありません。誰に
もコンテンツを自由に楽しむ権利、ある。
よそはよそ、キータはキータです。
それがわからないのであれば、少なくともあなたはキータで、キータの人に迷惑をかけて
いる。退場なさい。
SonshiKaruma
0 contribution
Nov 03, 2015 10:30
'Thank
ですから、そういうのをやめなさいと叱られているのがわからないのですか?悲しい。
オウム返しを自覚してやってるなんてたちがわるいですね。
思い込みだけで騒ぎ、立証はおこたり、自分の言い分だけをきけという。
これがあなたのとっている態度なのですよ。
あなたは捨てアカウントではないのですか?違うのなら、せめて立証して批判すべきで
す。あたしは2chの人間がここを見てても不思議だとは思いませんけどね。
totemring
0 contribution
Nov 03, 2015 10:33
'Thank
http://qiita.com/SonshiKaruma
同じです。プロフィールに2ちゃんねるスレッドで著者を攻撃するときに用いる特徴的な
キーワードで埋め尽くす。
技術論を無関係な炎上マッチポンプを姑息に狙う横槍コメントが繰り返されているだけで
す。
子供じみたオウム返しなんかでごまかして、恥ずかしいと思わないの?
全く思いません。なぜなら、白々しい嘘をもって証明しろという低レベルな次元の問いか
けについては、
それと同等のオウム返しが有効だからです。
https://archive.is/r4i8e
137/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
それと同等のオウム返しが有効だからです。
もし相手が自身「チンピラのインネン」でなく「証明」に足る主張でこちらを批判してい
るのならば、まず自身が「証明」してみせた上で、こちらを批判するのが道理であるとい
うことです。「科学的態度」などとあざとい批判をするに足りるのか、それこそ自身の立
場を証明してからの話。
彼らが客観的に露出させている証拠としては、なんら技術論に寄与せず、私が書いたコメ
ントのあとに一連の横槍コメントを逐一追加して、消してはまた同一内容をポストして移
動させ、単に議論を妨害してコメント欄を汚すことくらいでしょう。
90%
SonshiKaruma
Nov 03, 2015 10:38
'Thank
0 contribution
あなたは荒らし行為も同然のことをしているご自覚、ないの?
totemring
Nov 03, 2015 10:40
'Thank
0 contribution
そのことばはそのまま返します。オウム返しというのは、適切に使えば子供じみたどころ
か論理的に極めて有効な言及ですね。
「自覚」については、繰り返し書いたとおり、
ここでの一番の問題は、@SonshiKarumaその他のように、あたかも技術的トピックに興
味がある勉強しにきているという公正中立な立場を装いながら、まるで議論に関与せず
(できず)、その主たる目的はあくまで著者を中傷
謗する、いわば炎上のマッチポンプ
の役割を果たしたい固定された面子の横槍コメントが横行していることです。
なぜこのような事がこの記事に起こるのか?というと、とりもなおさず上述のとおり、公
正中立に見せかけた @Lambada @nonstarter はじめ、当該2ちゃんねるスレッドとリン
クしながら展開するこの「キャンペーン」に便乗参加しているからだ、ということになり
ます。
言うまでもありませんが、Qiitaはそれこそ「客観的」な技術的情報を共有するサイトであ
り、特定個人への攻撃や、著書をネガティブキャンペーンする場ではありません。
本記事はそもそもが主観的なレビューではありますが、Qiitaにおいて存在を許容されてい
るのは、それがあくまで規約に則った社会的利害に沿うものであるという大前提があると
考えます。当方が説明した以上のような状況は明らかにサイトの理念と規約に反してお
り、そのことをここで共有して注意喚起を促したいと考えています。
技術論そのものについては、一連の固定化した否定ありきの特定の面子ではなく、広い読
者は自分の頭でその是非を判断できるのだから、横槍で何をどう印象操作しようとも無駄
です。
SonshiKaruma
0 contribution
Nov 03, 2015 10:45
'Thank
同じ文章のコピべ、よくない。通報が良いのですかね•••
totemring
0 contribution
Nov 03, 2015 10:48
'Thank
きちんと説明を尽くしても、壊れたレコードのように、いい加減に同じ横槍「 り」しか
しない、できない、
技術論になにひとつ価値を提供できず、ひたすら要求を重ねるだけの相手に対して
https://archive.is/r4i8e
138/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
技術論になにひとつ価値を提供できず、ひたすら要求を重ねるだけの相手に対して
リンクを貼っても読まないようなので、読む気すらないようなので、
内容「再掲」して明示することになんの問題があるのですか?
きちんと読んで二度と同じ質問、
りを繰り返さないでください、迷惑なので。
引用、再掲を同じ文章のコピペと呼ぶならばそれはそのとおりですが、これはスパム行為
には該当しません。
無論、こちらは一方的に横槍を入れられて、要求を重ねるだけの固定メンバーによる繰り
返される要求にこれまで説明はしましたが、今後これ以上同じ説明をする必要も義務も感
じません。
keFun
0 contribution
Nov 03, 2015 18:01
'Thank
@totemring さんのコメントで指摘しておきたいことがいくつかあります。
まず "2015/11/02 17:39" に書き込まれたコメントについて。
「参照透過である」とは、何から何への参照がどういう条件を満たすことを言うのか と
いう記事の一部に対して
私が要約すると、
そもそもの、従来の意味論における「参照透過」とは、
1.値referent・denotation そのものは、形式言語の外側に存在する
2.言語内の式expression は、その値referent・denotationを参照(指示)する
3.同一の値referent・denotationを参照(指示)する言語内の式expressionは交換
可能であり、それが参照透過である
ということです。
上記の従来の意味論における「参照透過」の概念、
形式言語の外側に存在する値referent・denotationを考えずに、
コードの評価のプロセスからのみ得られる、算術の値、
つまり@Lambadaが言っている、
副作用がない数式のように扱うことが可能となります
言語内でも式の値を表せます
とか言ってるほうの「それ」のことですが、
「それ」は、上記の従来の意味論における「参照透過」の概念の「部分集合」とし
ては成立する、ということになります。
と書いています。
ここで確認しておきますが、「部分集合」とは「全体集合」の一部であるということで
す。
ところが元の記事の「関数型言語界隈へストレイチーやランディンがもたらしたもの」の
https://archive.is/r4i8e
139/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
ところが元の記事の「関数型言語界隈へストレイチーやランディンがもたらしたもの」の
中で
・関数型のプログラマは、これらの「値」はプログラミング言語の外ではなく内側
に存在していると考えているようですが、この点では、哲学者のみならず、プログ
ラミング言語の意味論の研究者たちとも全く異なっています
「哲学者のみならず、プログラミング言語の意味論の研究者たちとも全く異なっていま
す」と書かれていることからわかるように、「関数型のプログラマが使用する『参照透
過』」という概念は @totemring さんが書いているところの「上記の従来の意味論におけ
る『参照透過』」の概念の部分集合などではなく、異なるものです。
@totemring さんは
私が言うDate.now()とは、従来の意味論において、紛れもなく参照透過ですが、
と書いていますが(この文章自体、私にはまったくもって意味不明ですが…)もしそれが
事実なら、Date.now() は「関数型プログラマ」が使用する意味での「参照透過」ではない
ということになります。
結局、@totemring さんは自分で自分がまちがっていることを長々と書いていたんですね
(笑)
次に "2015/11/03 03:35" に書き込まれたコメントについてです。
@totemring さんは次のように書き込んでいます。
JavaScriptのDate.nowは、特定の時刻を表す整数や文字列等を表す関数ではなく、
IOアクションです。
(これは関数であり、単なる一つのファーストクラスオブジェクトを参照する意味
論における言語外の「値」であることに注意してください)。
そのIOアクション(JavaScriptのDate.now)は特定の時刻を表す整数等ではなく、
「現在時刻を取得する」という動作を表す値に過ぎませんので、それ自体は副作用
も「暗黙の引数」もなく、時刻によって値が変わったりはしません。
これは確かに初学者が混乱しやすいところではありますが、Haskell等のモナドの基
本であるIOアクションが「動作を表す値」に過ぎないことを理解している必要すら
なく、Date.nowという関数が第一級値(ファーストクラスオブジェクト)としてリ
ストの要素や関数の引数や戻り値になりうることは関数型言語の必要条件にすぎま
せん。
私は JavaScript はあまり詳しくないのですが、 JavaScript に IOアクション があるという
のは初耳でした(笑)
続く文章で Haskell の IOアクションへの言及があったので、そちらに対しての指摘のみを
します。
https://archive.is/r4i8e
140/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
します。
Haskell の IOアクションは一部に参照透過なものが含まれていたとしても、IOアクション
全体は参照透過ではありません。これは Haskell をある程度学習した人ならみなさんご存
知のことと思います。
ですから、「Date.now は IOアクションである」と @totemring さんが主張するのなら、
それは「Date.now は参照透過ではない」ということと同じだと言えます。
もしかして「Haskell の IOアクションは参照透過ではないかもしれないが、 JavaScript の
IOアクションは参照透過だ」とでも言い出しますか?(笑)
MIT_GEEK
0 contribution
Nov 03, 2015 20:24
'Thank
なるほど。@kefun様、著者である岡部健の誤りがよくわかりました、感謝。
ここと併せて読むと理解が早かったです。
http://qiita.com/hiruberuto/items/26a813ab2b188ca39019
http://qiita.com/esumii/items/ec589d138e72e22ea97e
これからもエントリ主共々、荒らしに屈せずがんばってください
totemring
0 contribution
Nov 03, 2015 20:41
'Thank
内容などない単なる揚げ足取りに、
「お疲れ様です」「感謝」「これからもエントリ主共々、荒らしに屈せずがんばってくだ
さい」・・・
また否定したいだけのくだらない「横槍」の「連携」。
こういうのを「ネガティブキャンペーン」だ、って言われてるのですよ。
自分たちで憚らずやりほうだいで「陰謀論だ」とか何を言ってるんでしょうか。
「部分集合」という言葉遣いについては、そういう揚げ足取りが出ることは半ば予想して
おり、
コメントしたあとも別の言葉に変えるか迷っていたのですが、「意味」は伝わるだろうと
放置していました。
しかしそのことをもって、
結局、@totemring さんは自分で自分がまちがっていることを長々と書いていたんで
すね(笑)
このような(いつもの)よく考えもしない、考えるつもりもない、否定ありきの否定でき
ればそれでよいというくだらない詭弁が弄される以上、より正確に論じておく必要が生じ
ました。また読者の参考にもなるでしょう。
「哲学者のみならず、プログラミング言語の意味論の研究者たちとも全く異なって
います」と書かれていることからわかるように、「関数型のプログラマが使用する
https://archive.is/r4i8e
141/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
います」と書かれていることからわかるように、「関数型のプログラマが使用する
『参照透過』」という概念は @totemring さんが書いているところの「上記の従来
の意味論における『参照透過』」の概念の部分集合などではなく、異なるもので
す。
「全く異なっている」から同じ集合に属さないというのは論理的に誤りで、
「異なる」のは、「参照透過」を適用する「範囲」です。
「値」とは意味論においてあくまで言語外の概念ですが、たとえば同時刻における算術の
体系の範囲内の言語内の「値」として整合が取れる場合、わざわざ意味論の言語外の
「値」のレベルに降りる必要はありません。この「範囲」が限定されるという意味で部分
集合であると表現しました。
「値」が言語内であるのと言語外であることは真逆と言えるし、「範囲」を限定して「範
囲」が異なる、のは、文字通り異なるわけです。しかしそれをもって私が「部分集合」で
あると表現したのはさほど不適切であるとは思っていません。
事実、Reddyはほとんどすべての関数型プログラマは@Lambadaが書いていたように純粋
関数型にのみ「参照透過」の概念が成り立つと思い込んで入るが、「命令型」にも「参照
透過」は適用される概念であるし、
ひとたび式の(いわゆる)「値」(かつての哲学者の講釈に従えば “referent”,
“denotaion” ですが)を複雑な数学的・観念的なオブジェクトと見なすことができれ
ば、あらゆる種類の可能性が開けてきます。
あらゆる可能性が開かれてきます、つまり歪んだニュアンスをもって伝播された「参照透
過」の概念の適用範囲は広がる、開かれる、と結論づけています。このことをもってして
も私は「部分集合」であると表現しました。
実際自分はその点、読解理解に苦しんだのかもしれませんが。
また、
と書いていますが(この文章自体、私にはまったくもって意味不明ですが…)もし
それが事実なら、Date.now() は「関数型プログラマ」が使用する意味での「参照透
過」ではないということになります。
というのは、Reddyの批判文意に同調する私の見解について、またReddyの文意をそのま
ま繰り返しているだけであり、
Reddyが批判する「関数型プログラマ」の間違った理解に基づくならば、「そのとおりで
すが何か?」と言うしかありません。
念の為ですが、間違った解釈において「参照透過」ではないというのが批判されているの
だから、
Date.now()は参照透過だ、っていう議論をずっとしているのですが、あなたは別にReddy
の文章もろくに読んでいないのでしょうね。
ただ否定できればいいとおもっているだけで。
この帰結として、
https://archive.is/r4i8e
142/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
結局、@totemring さんは自分で自分がまちがっていることを長々と書いていたんで
すね(笑)
となりようもないし、このように「茶化した」時点で、この@keFunの論評などおおよそ
公平性、信ぴょう性などない、真剣に取り合う価値などないというのはおそらく広い読者
は印象づけられることでしょう。
JavaScript に IOアクション があるというのは初耳でした(笑)
そのような明示的定義は特別存在しませんが、概念的に模倣することはもちろん可能であ
る、ということを示したにすぎません。
初耳なのは、ある概念実装が特にある言語と密接である、ということは珍しくないが、
その概念実装と密接でない言語で考察してみる、といういわばゼロベースの思考形態にあ
なたが慣れていない、ということにすぎません。「初耳」といのは、すでに誰かがやった
ことを読んでからでないと自分はなにひとつ新しい考察はできないのだ、という表明にす
ぎません。
Haskell の IOアクションは一部に参照透過なものが含まれていたとしても、IOアク
ション全体は参照透過ではありません。これは Haskell をある程度学習した人なら
みなさんご存知のことと思います。
これは Haskell をある程度学習した人ならみなさんご存知のことと思います。
などと書いていますが、意味不明。
あと(笑)(笑)って、茶化しているつもりでしょうが、あなたの文章はそんな上から目
線になるほど妥当でも深淵でもありません。何か指摘したいのであれば、もうちょっと自
身を省みて謙虚な文章にすることをおすすめします。
keFun
Nov 03, 2015 23:59
'Thank
0 contribution
@totemring さんへ
全体集合を A, 部分集合を B とすれば A
B となり、B は必ず A を満す条件を満します。
ですから「参照透過」を適用する「範囲」が異なるならそれはもう部分集合ではありませ
ん。
UCLA を卒業した @totemring さんは数学で習わなかったのでしょうか?
@totemring さんは
「全く異なっている」から同じ集合に属さないというのは論理的に誤りで、
と書いてますが、「全く異なっている」なら同じ集合に属すはずないじゃないですか
www
((笑)と書いたら怒られたので、草を生やしてみました www)
そもそも「関数型プログラミングにおける『参照透過性』」に関して議論しているのに、
どうして他の分野に関する事を混じえて話を混乱させるようなことをするのですか?
https://archive.is/r4i8e
143/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
どうして他の分野に関する事を混じえて話を混乱させるようなことをするのですか?
それから、
JavaScript に IOアクション があるというのは初耳でした(笑)
そのような明示的定義は特別存在しませんが、概念的に模倣することはもちろん可
能である、ということを示したにすぎません。
初耳なのは、ある概念実装が特にある言語と密接である、ということは珍しくない
が、
その概念実装と密接でない言語で考察してみる、といういわばゼロベースの思考形
態にあなたが慣れていない、ということにすぎません。「初耳」といのは、すでに
誰かがやったことを読んでからでないと自分はなにひとつ新しい考察はできないの
だ、という表明にすぎません。
というコメントがありましたが、@totemring さんが「Javascript における IOアクショ
ン」などという概念を突然言い出したのなら、私が聞いたことがないのはあたりまえじゃ
ないですか?
それにしても、理論的なことで反論できなくなると相手の人格を攻撃するパターンは相変
わらずですね。
せっかくソックパペットを使って他人の振りをするなら、もう少し芸風を変えないと面白
くないですよ。
そんなことばかりしていると、stack overflow で "reduce function composed of map
function in JavaScript" と質問した時みたいに "What are you talking about?" って書かれ
てしまいますよ。
あと(笑)(笑)って、茶化しているつもりでしょうが、あなたの文章はそんな上
から目線になるほど妥当でも深淵でもありません。何か指摘したいのであれば、も
うちょっと自身を省みて謙虚な文章にすることをおすすめします。
上から目線なんてとんでもありません。
私は他の方が笑いながらあえてスルーしていることをわざわざ書いて、あなたをおちょく
ってるだけですよwww
これまでのやりとりで、あなたが「関数型プログラミング」に関して何も分かっていない
ことをみなさんが理解できたと思います。@totemring さん、まだ何かコメントしたいこ
とがあるのなら、どうぞ好きなだけ自爆し続けてくださいwww
totemring
0 contribution
Nov 04, 2015 01:04
'Thank
「部分集合」という表現について、よくもまあこれだけくだらない揚げ足取りを嬉しそう
に展開して、「関数型プログラミングを理解していない」という論理の飛躍の帰結に結び
つけるものだ、と呆れながら読了。
中学範囲で習う集合について、何を喜んで書いているのかわかりませんが、
https://archive.is/r4i8e
144/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
中学範囲で習う集合について、何を喜んで書いているのかわかりませんが、
単に、全体集合A, 部分集合Bのどっちを参照透過の集合と捉えるかという話に過ぎないの
に意味が理解できないのはよくわかりました。
「全く異なっている」なら同じ集合に属すはずないじゃないですか www
これについて、全体集合A, 部分集合Bのどっちを参照透過の集合と捉えるか、と説明した
のに、理解できない。なるほど。
あるいはうっすらと説明を読めているのかもしれないが、「部分集合ネタで揚げ足をとっ
て叩く」と方向を設定してしまったので、もうあとはこちらが何を説明しようが、聞く耳
を持たない。こういう話法は単なるヘイトスピーカー、 謗中傷犯がガナリたてる話法で
す。
自分が思いついたネタで、最後まで押し通すだけで、対話、議論の余地なんてない。
もっとも、Date.nowの議論にしても、いくら理路の破綻を指摘されても、ノラリクラリ
と意見を変えながら最後まで自分の誤りを認められない@Lambadaなども同じですが。
「否定目的の否定ありき」は程度は違えど同じ穴のムジナです。
それにしても、理論的なことで反論できなくなると相手の人格を攻撃するパターン
は相変わらずですね。
せっかくソックパペットを使って他人の振りをするなら、もう少し芸風を変えない
と面白くないですよ。
「理論的」?あなたの徹頭徹尾つまらなくくだらない揚げ足取りでしかない駄文のどこに
「理論」なんてものがあるのですか?
見ていたらわかるでしょう?少なくとも、@Lambadaなどは、理路は決定的に間違ってい
るが、まだこちらも技術論、理論の話で返す土壌にあるが、あなたとのやりとりは低レベ
ルすぎて、こちらが返すコメントもたかだかこんな程度になるんですよ。「理論」などと
はお笑い種です。
((笑)と書いたら怒られたので、草を生やしてみました www)みたいにくだらない事言
う以外はせいぜい、理解できる、議論できる範疇は、中学で、義務教育で習う集合くらい
だ、ってことでしょ?
「ソックパペット」ってなんのことでしょうか?芸風?何言ってるんですか?
このコメント欄で登場してから今まで首尾一貫して人格攻撃に徹しているのは他ならぬ
「あなた」であり、
それ以外のコメントは一切していませんよね?
私は他の方が笑いながらあえてスルーしていることをわざわざ書いて、あなたをお
ちょくってるだけですよwww
なるほど、人格攻撃に加えて、意図的な「荒らし」行為をしていると。
言うまでもないですが、ここはそういう場ではないので、それが「荒らし行為」であるこ
とくらいは無論理解しているんでしょうね?
「他の方」が笑いながらあえてスルーしていること、っていうソースでもあるんですか?
それぞれ適当に「あら捜しできそうな場所」を探して、その「部分集合」という意味が理
解できず、そこにつっかかったのがたまたたまその嵐集団のうちのひとりであるあなたで
あったにすぎないでしょう。
https://archive.is/r4i8e
145/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
これまでのやりとりで、あなたが「関数型プログラミング」に関して何も分かって
いないことをみなさんが理解できたと思います。
「みなさん」って誰ですか?荒らしの仲間ですよね?根本的にこの手のネットでダマにな
っている「荒らし」の世界の認知の歪みとは、そうやってわーっとよって悪口、中傷 謗
をやるような性根の腐った井戸の中ではそれはまわりは全部そういう性根の腐った連中し
かいないわけです。しかしそれはあくまで「井戸の中」であり、気の利いたまともな人間
はそんな場所には関与しない。その「井戸の中」が世界の全部だとか思っているから、な
んの自覚もなくぬけぬけと「みなさん」などと言う。「みなさん」って誰ですか?
たとえばヘイトスピーチの在特会の連中も、ネットの限定された空間にいるまでは、「み
なさん」自分たちと同じ意見だと思っていた。しかし徐々に活動を広げて「井戸の外の世
界」に出るやいなや社会から批判を浴び排斥された。あなたの見ている「みなさん」なん
てそんな程度。
文句があるのなら、
私は他の方が笑いながらあえてスルーしていることをわざわざ書いて、あなたをお
ちょくってるだけですよwww
なんて井戸の底から外の世界がかいま見える天にむかって石をなげるような小汚い真似を
するんじゃなくて、言論的に正攻法でやればいいんじゃないですかね?しかしそんなこと
はあなたには出来ない。せいぜい2ちゃんの著者にむけた個人攻撃スレで、 謗中傷集団
のリーダーからもらった安い「コードネーム」で影から石を投げて、成果だよくやったと
かくだらないことしているだけでしょ?
著者をストーキングするメンバーについては某所でプロファイリングがまとめられてお
り、
「ソックパペット」というWikipedia用語を使い、古くからストーキングを続けているこ
とをアピールするために「相変わらず」という言葉を頻用するのは、
「いや何もrevertと削除ばかりしてるわけでは……(汗)。」などと書いている、
Wikipedia日本語版で管理者解任されたNikeです。
https://ja.wikipedia.org/wiki/Wikipedia:%E7%AE%A1%E7%90%86%E8%80%85%E3%
81%AE%E8%A7%A3%E4%BB%BB/%EF%BC%AE%EF%BD%89%EF%BC%AB%EF
%BD%85_20080110
いったい何年ストーキングしているんでしょうかね?
本論については何も理解していないので、反論のしようもない、仕方がないので、
どこか揚げ足取りをするところはないか?と探しまわり中学で誰でも習う「部分集合」と
いう言葉尻だけを見つけた。たまたま今回見つけたのは「あなた」です。他の連中は気に
なっていないかもしれない。しかしそんな都合の悪いことは関係ない、「みんな、他の方
があえてスルーしていること」と適当に大風呂敷を広げて、あたかも当たり前の批判のよ
うにカマをかける。そういうことしかいつもやってないんでしょ?異常な行動様式だが自
覚は露ほどもない。
@totemring さん、まだ何かコメントしたいことがあるのなら、どうぞ好きなだけ自
爆し続けてくださいwww
https://archive.is/r4i8e
146/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
爆し続けてくださいwww
ああ、もう「ひとおとり荒らした」ので別の「荒らし」にバトンタッチして消える、って
いう予告ですか。とりあえず「荒らし」がひとり消えるのは結構ですが、またほとぼりが
冷めたら出てくるので、堂々巡りですね。いい加減にしたらどうか?
さてこんどは「バトンタッチ」したどの「ソックパペット」が出てきて本論と無関係の横
槍を入れて「荒らす」んでしょうかね?
ほとぼりが冷めたとおもって、また壊れたレコードのように繰り返すのか。
keFun
Nov 04, 2015 06:49
'Thank
0 contribution
こういう話法は単なるヘイトスピーカー、
謗中傷犯がガナリたてる話法です。
@totemring さん、またいつものように「自分の意見に対する反論は 謗中傷」という路
線で話を展開するんですね。またしてもワンパターンwww
だから、同じ芸風だと飽きられると前から言ってるのに…。
自分が思いついたネタで、最後まで押し通すだけで、対話、議論の余地なんてな
い。
もっとも、Date.nowの議論にしても、いくら理路の破綻を指摘されても、ノラリク
ラリと意見を変えながら最後まで自分の誤りを認められない
@totemring さんは鏡に向かって話をしているのですか?www
MIT_GEEK
Nov 04, 2015 07:29
'Thank
0 contribution
@keFun さん、荒らしに対して挑発的な反応は、いかがなものか。岡部健はどうやら自分
の投稿が一番下(つまり最新日付)に来るように、再投稿を繰り返してるようです。昨日
の20:41の岡部健の投稿は、私の20:24の投稿の前にあったのですが、やることが子供じみ
てる。
この人物の目的は概ね判明したので、繰り返されれば通報しましょう。
いきなりWikipediaのユーザーにまで名指しで
謗中傷を始めたようなので、看過できな
いレベルです。
totemring
0 contribution
Nov 04, 2015 07:40
'Thank
@totemring さん、またいつものように「自分の意見に対する反論は 謗中傷」とい
う路線で話を展開するんですね。またしてもワンパターンww
いや何言ってるのか意味がわかりませんが、
私は他の方が笑いながらあえてスルーしていることをわざわざ書いて、あなたをお
ちょくってるだけですよwww
https://archive.is/r4i8e
147/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
と自分が言ってるのをもう忘れたみたいで、おめでたいことです。
「意見に反対」て、あなたせいぜい中学範囲の「部分集合」という用語、表現について極
めてくだらない揚げ足取りしかできないじゃないですか。
Haskell の IOアクションは一部に参照透過なものが含まれていたとしても、IOアク
ション全体は参照透過ではありません。これは Haskell をある程度学習した人なら
みなさんご存知のことと思います。
これは Haskell をある程度学習した人ならみなさんご存知のことと思います。
というわけのわからない「挑戦」はしてみたものの、尻つぼみ。
「参照透過」の用語の定義について議論しているときに、
IOアクションは一部に参照透過なものが含まれていたとしても、IOアクション全体
は参照透過ではありません。
などといい加減なことを放言し、挙句の果てに「Haskell をある程度学習した人ならみな
さんご存知のことと思います。」などといい加減なことを言う。そういう低レベルなこと
しか言えてませんよね?
「参照透過」の定義についての論拠を述べるときに「参照透過」をもって説明するのは自
己言及であり、こういう不用意な言及をするものの神経/配慮の無さを疑いますが、そう
いうあなたの資質不足も含めて、はっきりいって議論の邪魔です。
たったそれだけを起点に極めて幼稚な囃し立てしかできないくせに、
私は他の方が笑いながらあえてスルーしていることをわざわざ書いて、あなたをお
ちょくってるだけですよwww
だから、同じ芸風だと飽きられると前から言ってるのに…。
しきりに「芸風」だの「飽きられる」だのふざけたことを言いながら囃し立てるしか能が
ない自分の行動が「
謗中傷」ではない、とでも?
自分が思いついたネタで、最後まで押し通すだけで、対話、議論の余地なんて
ない。
もっとも、Date.nowの議論にしても、いくら理路の破綻を指摘されても、ノ
ラリクラリと意見を変えながら最後まで自分の誤りを認められない
@totemring さんは鏡に向かって話をしているのですか?www
えー
自分が思いついたネタで、最後まで押し通すだけで、対話、議論の余地なんてな
い。
もっとも、Date.nowの議論にしても、いくら理路の破綻を指摘されても、ノラリク
ラリと意見を変えながら最後まで自分の誤りを認められない@Lambadaなども同じ
ですが。「否定目的の否定ありき」は程度は違えど同じ穴のムジナです。
https://archive.is/r4i8e
148/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
と書きました。
Date.nowの議論で私は「ノラリクラリと意見を変えた」ことは一度もありません。
「否定」しているのは、@Lambadaその他であり、その理路について、
「値」が言語内にある→言語外にある→純粋関数型なのでやはり言語内だ、
と支離滅裂な変遷の上、言を変え、一貫性のない「否定」を試み失敗したのは、@Lamba
daであると論証したのですが、都合の良い切り貼りだけするのは、 謗中傷犯の異様な行
動様式ですがもう常習過ぎて自覚もないんでしょうね。
だから、同じ芸風だと飽きられると前から言ってるのに…。
「前から言ってるのに」?
あなたは一体「誰」で、いつからストーキングしているんですか?
ソックパペットソックパペットってNIKEですよね?
「飽きられる」?
ストーカーなんだから、「飽きる」ことなんてないんでしょ?
著者の著書の「レビュー」なんてものには鼻から興味なんてなく、
あちらでもこちらでも単にストーキング、粘着、
いきなりWikipediaのユーザーにまで名指しで
謗中傷しにきているだけですよね?
謗中傷を始めたようなので、看過で
きないレベルです。
ならば、
いきなり著者にまで名指しで
謗中傷を始めたようなので、看過できないレベルで
す。
低レベルで内容などない単なる揚げ足取りに、
「お疲れ様です」「感謝」「これからもエントリ主共々、荒らしに屈せずがんばってくだ
さい」・・・
また否定したいだけのくだらない「横槍」の「連携」。
こういうのを「ネガティブキャンペーン」だ、って言われてるのですよ。看過できないレ
ベルなのはそちら。
この人物の目的は概ね判明したので、繰り返されれば通報しましょう。
これもこちらの台詞。
なんら「参照透過」「意味論」における「値/denotation/referent」の本論には触らない、
触れない、技術論ですらない中学レベルの用語の揚げ足取りや 謗中傷のみに終始する。
それも同じ「ネタ」を何度も何度も幼稚になぞることしかできず、まったく同じ様に幼稚
に囃し立てるだけのワンパターンの「ネガティブキャンペーン」「荒らし行為」を続けて
おり、もう一連の固定メンバーの目的は明らかになっていますが、どうせまた悪質な炎上
狙いのコメントを懲りもせず続けるのでしょう。
Q_Jirou
0 contribution
https://archive.is/r4i8e
Nov 04, 2015 10:52
'Thank
149/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
著者でもない人がなんでそこまで中傷だなんだとお怒りなんですか?
totemring
0 contribution
Nov 04, 2015 11:17
'Thank
なんら「参照透過」「意味論」における「値/denotation/referent」の本論には触ら
ない、触れない、技術論ですらない中学レベルの用語の揚げ足取りや 謗中傷のみ
に終始する。それも同じ「ネタ」を何度も何度も幼稚になぞることしかできず、ま
ったく同じ様に幼稚に囃し立てるだけのワンパターンの「ネガティブキャンペー
ン」「荒らし行為」を続けており、もう一連の固定メンバーの目的は明らかになっ
ていますが、どうせまた悪質な炎上狙いのコメントを懲りもせず続けるのでしょ
う。
久間知毅 @HisamaTomoki含む
Q_Jirou
0 contribution
Nov 04, 2015 11:24
'Thank
その、久なんとかという人はどなたですか?Qiitaユーザーではなさそうですが。ご自身の
文章の引用と、どなたかの名前を書くだけで、意図が見えません。
繰り返しますが、岡部健さん本人でもない人が、なぜ岡部さんの代弁かのごとく、そこま
でお怒りなのですか?
totemring
0 contribution
Nov 04, 2015 11:27
'Thank
いや、その「一連の固定メンバー」に久間知毅 @HisamaTomoki含むと書いただけで、さ
ほど難しい文脈でもないと思いますが。
Q_Jirou
0 contribution
Nov 04, 2015 11:29
'Thank
それは誰なんですか。どこから沸いてきた名前ですか。その人が、何をして、どういう文
脈でここに書いたのですか?
「一連の固定メンバー」もそうですが、具体性がないので意味が不明です。
実在の人間のお名前ならば、迷惑行為なのでおやめなさい。
totemring
0 contribution
Nov 04, 2015 11:33
'Thank
質問があったのであえて書きますが、
Q次郎◇h6EC5BK7zm2w=久松ゴサク◇HczBM5JDAg=久間知毅だったのに
と著者個人を攻撃する2ちゃんねるスレッドに書かれており、中国製違法機器による不正
アクセスに関与している犯罪者であると告発されている 謗中傷犯です。
実在の人間のお名前ならば、迷惑行為なのでおやめなさい。
https://archive.is/r4i8e
150/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
実在の人間のお名前ならば、迷惑行為なのでおやめなさい。
はて?あなたもあなたのお友達も著者という実在の人物について随分と「迷惑行為」を続
けているようですが?
繰り返しますが、久間知毅さん本人でもない人が、なぜ久間知毅さんの代弁かのごとく、
そこまでお怒りなのですか?
Q_Jirou
0 contribution
Nov 04, 2015 11:47
'Thank
私の友達とは誰でしょうか?あなたが私の交友関係をご存じのはずもなく、どうしてその
ようなことを仰るんですか?むろん、久なんとかさんも知らない人。
一体、あなたは何の話をしているのですか?
不正アクセスってなんですか??もうわけがわからない。
totemring
0 contribution
Nov 04, 2015 11:49
'Thank
なぜあなたは、それほどまでに、著者のみを攻撃する分には極めて寛容で自身加担しなが
ら、
私がその一連の所業が姑息な迷惑行為であると論じただけで、
「なぜ本人でないのに怒る?」としつこく問いかける分際で、
著者を執拗に攻撃する人物への「告発」については、
「実在の人間のお名前ならば、迷惑行為なのでおやめなさい」
などとダブルスタンダードの態度をいけしゃあしゃあと取っているのでしょうか?
久なんとかさん、ではなく、久間知毅さんです。
繰り返しますが、久間知毅さん本人でもない人が、なぜ久間知毅さんの代弁かのごとく、
そこまでお怒りなのですか?
Q_Jirou
0 contribution
Nov 04, 2015 11:57
'Thank
私の質問には答えず、あなたは質問をするんですね。
まあいいですけど、いきなり実名らしき名前を出すのは、実在ならば明らかに迷惑行為で
しょう。
そして、私はそうした迷惑行為に値する「著者への攻撃」を見たことがありません。なの
で、寛容もくそもないです。
著者への攻撃があれば咎めるでしょう。
さらに言うと、私はその人についてはまったく知らないし、あなたの言ってる「ネガティ
ブキャンペーン」「一連の固定メンバー」とかについては、
あなたの虚構だと思うからです。
虚構に実在の人物をからませようとしてるのであれば、やめろぐらいは言います。
totemring
0 contribution
Nov 04, 2015 12:02
'Thank
著者にまとわりつくように個人攻撃を続けている集団と2ちゃんねるスレッドとこの記事
の関連性についてはさんざん論じたので繰り返しませんが、その集団は犯罪集団であり、
2チャンネルスレッドで「Q次郎」と名乗る人物がそのメンバーであると告発されてい
https://archive.is/r4i8e
151/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
2015/11/05 0:41
る、と、
それは誰なんですか。どこから沸いてきた名前ですか。その人が、何をして、どう
いう文脈でここに書いたのですか?
というあなたの質問に呼応して書いたことは迷惑行為だとは思いません。
私はそうした迷惑行為に値する「著者への攻撃」を見たことがありません
「値する」ってどういう意味ですか?
なんだろう?自分たちがやってることは冗談、お遊びであるが、自分たちへの批判は「迷
惑行為」だというふざけたダブルスタンダードなのかな?
なので、寛容もくそもないです。
著者への攻撃があれば咎めるでしょう。
おやおやまたまたご冗談を。
そもそもこの批判的レビューの技術論になんら寄与することもなく、
ひたすら著者に攻撃的なコメントに同調することに終始しているあなたが何を言ってるの
ですかね。
私がちょっと批判しただけで、
著者でもない人がなんでそこまで中傷だなんだとお怒りなんですか?
などと牽制するような人物が何を言ってるのですかね。
Q_Jirou
0 contribution
Nov 04, 2015 12:09
'Thank
中傷行為などは確認できません。事実であれば削除されてるでしょう。
事実、削除された投稿はQIITAには沢山あります。
繰り返しますが、私はその久なんとかさんとは無関係なので、今後、そのお名前を書くの
はおやめなさい。
さきほどの記述も、氏名は削除することをお勧めします。
totemring
0 contribution
Nov 04, 2015 12:11
'Thank
運営の判断=事実関係を精査したうえでの中傷行為の削除 ではありません。
繰り返しますが、私はその久なんとかさんとは無関係なので、今後、そのお名前を
書くのはおやめなさい。
久なんとかさん、ではなく、久間知毅さんです。
繰り返しますが、久間知毅さん本人でもない人が、なぜ久間知毅さんの代弁かのごとく、
そこまでお怒りなのですか?
https://archive.is/r4i8e
152/153 ページ
関数型言語 - 『関数型プログラミングに目覚めた!』のレビュー(Day-1) - Qiita
Q_Jirou
2015/11/05 0:41
Nov 04, 2015 12:24
'Thank
0 contribution
事実関係とは何ですか。事実であろうがなかろうが、迷惑行為は迷惑行為なので、迷惑行
為があれば削除されますよ。
削除依頼とか、出したんですか?
そして私はQ次郎ではなく、Q_Jirouです。
そして、その久なんとかさんが何をした人なのかは知らないし、書かなくてもいい。
だけど、私を絡めた以上はその人たちにも迷惑がかかるので、やめてください。
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.
© 2015 Increments Inc. Terms Privacy Help Contact
About Blog API Team Kobito Career ♥ Feedback )
100%
https://archive.is/r4i8e
153/153 ページ
Fly UP