[FAQ]Haskellには副作用があるのか、ないのか

副作用ということばのゆれ、手続き型脳と関数型脳という造語によるしなくてもいいクラスタの分類が、この対話でみえてきます。
20
山本和彦 @kazu_yamamoto

「モナド遊び」を書き始めました。気長に書き進めていきます。 http://www.mew.org/~kazu/proj/monad/

2010-06-04 18:10:20
Nobuo Yamashita @nobsun

モナドの話をするときに副作用への言及は不要だと思います。もし言及するなら、定義を明示していただけると嬉しいなぁ。それと記述対象の性質についてなのか、記述言語の性質なのかを是非区別してもらえると混乱しなくていいなぁ。と思います。

2010-06-04 19:09:55
山本和彦 @kazu_yamamoto

Simon によれば、副作用とは「変更可能な状態を読んだり書いたりするような何か」です。

2010-06-04 22:07:07
山本和彦 @kazu_yamamoto

この本は、命令型言語プログラマーで、プログラミングHaskellを読んだぐらいの知識がある人が対象です。ですので、命令型言語プログラマーの言葉で書きます。

2010-06-04 22:08:10
山本和彦 @kazu_yamamoto

副作用は、参照透明性を破るものです。参照透明であれば、処理系が実行の順番を決められます。副作用がある場合は、プログラマーの記述が実行の順番です。

2010-06-04 22:09:51
山本和彦 @kazu_yamamoto

副作用を表す型は、IO と ST のみです。

2010-06-04 22:10:15
Nobuo Yamashita @nobsun

Simonの『変更可能な状態を読んだり書いたりするような何か』というのは表現する対象に関する言及ですよね。一方、『参照透明性を破るもの』の「参照透明性」というのは表現する側の言語に関する言及ですよね。

2010-06-04 22:46:35
山本和彦 @kazu_yamamoto

.@nobsun 表現という説明が命令プログラマーにはピンときません。僕はいつも動かしたときにどうか、について語っています。

2010-06-04 23:27:25
Nobuo Yamashita @nobsun

プログラム(算譜)は何かを表現していますよね。

2010-06-04 23:41:40
Nobuo Yamashita @nobsun

「動かしたときにどうか」は表現の対象になるものであって、表現側ではありません。話者の意図に反して「参照透明性」というのは表現する側に関する言及になっています。QT @kazu_yamamoto 僕はいつも動かしたときにどうか、について語っています。

2010-06-04 23:51:10
Nobuo Yamashita @nobsun

説明が悪いというのには同意します。その原因は、説明を求めている人に対してその人の言葉で説明していないことではなくて、Aの説明を聞いていると思っている人にBの説明をしているからだとおもうのです。

2010-06-05 00:17:07
Nobuo Yamashita @nobsun

ずれがあるのは認識しているのですが、私自身の言及のなかでズレが認識できていません。それで上手く伝えられないのでしょうね。QT @ikegami__ @nobsun @kazu_yamamoto 「表現」と「意味論」と reasoning でずれた議論をしているようにみえる

2010-06-05 00:26:57
Ikegami Daisuke @ikegami__

@kazu_yamamoto すくなくとも「副作用を表す型は、IO と ST のみです」は、ぼくは、納得がいきません。State モナドや RWST モナド、Error モナドなど、挙げたらきりがないくらい、あります

2010-06-05 00:44:18
Ikegami Daisuke @ikegami__

モナドのなかで閉じた再代入はゆるされます。世界は IO で、ぼくらはほかにもモナドを知っている、Haskell の利点は、再代入をプログラマが制御できることである

2010-06-05 00:54:42
Masahiro Sakai @masahiro_sakai

参照透明性の定義は幾つかあって http://bit.ly/9x4cPh 、「副作用がないこと」という定義も一応はあるのだけど、この「副作用」は @kazu_yamamoto さんが「Haskellには入出力という副作用はある」と言っている「副作用」ではないと思うんだよなぁ。

2010-06-05 01:01:30
Nobuo Yamashita @nobsun

Haskellには入出力という[現象を表現するの通常命令プログラマが命令型言語の持つ]副作用[という性質を利用して表現するのと同等の表現を行う手段]はある。

2010-06-05 01:14:37
Ikegami Daisuke @ikegami__

あと、call-by-value じゃないってことが重要です 

2010-06-05 01:16:21
Ikegami Daisuke @ikegami__

IO のせいで IORef という、きわめて特殊な子がいますけど…あと乱数とか…

2010-06-05 01:17:38
Masahiro Sakai @masahiro_sakai

(続き) だからこそ、Haskellは参照透明ということになっているわけで。だけど、@kazu_yamamoto さんの「Haskellには入出力という副作用はある」と「副作用は、参照透明性を破るものです」を合わせると、Haskellは参照透明でないことになってしまって……

2010-06-05 01:19:28
Masahiro Sakai @masahiro_sakai

(続き) 「命令型プログラマにとって入出力は副作用」というのはまだ受け入れられるけど、Haskellが参照透明でないというのは流石にちょっと受け入れがたいです。 > @kazu_yamamoto

2010-06-05 01:23:25
Nobuo Yamashita @nobsun

勝手な想像ですが、命令プログラマにとっては、入出力がある=副作用がある=参照透明性がない なので、「Haskellには副作用ない」「Haskellは参照透明である」は関数プログラマに取っては正しくとも命令プログラマに対する説明としては間違いということだと思う。

2010-06-05 01:28:45
Nobuo Yamashita @nobsun

大前提「副作用とは参照透明性を破壊するもの」、小前提「入出力は参照透明性を破壊する」、結論「入出力は副作用」という構造?

2010-06-05 01:44:52
Nobuo Yamashita @nobsun

だとすると、大前提はそのまま認めるとしても、小前提は付帯条件なしでは認められないなぁ。

2010-06-05 01:51:19
Ikegami Daisuke @ikegami__

同意 RT @nobsun: だとすると、大前提はそのまま認めるとしても、小前提は付帯条件なしでは認められないなぁ。

2010-06-05 01:52:55
Masahiro Sakai @masahiro_sakai

.@nobsun 私の意見は、「入出力がある=副作用がある」というときの副作用は命令型プログラマにとっての副作用で、「副作用がある=参照透明性がない」というときの副作用は関数型プログラマにとっての副作用なので、これをそのままつなげるのは変、という感じ。

2010-06-05 02:12:35
1 ・・ 10 次へ