教えて:「関数プログラミングでは if を使わない」という誤解はどこからくるの? たとえば、 http://t.co/ddwgDeeDwE だと Featherweight Java を根拠にしているみたいだけど、if がある世界にオブジェクトを追加しているでは?
2013-03-28 08:16:18@kazu_yamamoto そのリンク先の文章は「オブジェクト指向ではifは言語要素として不要である」と言ってるだけでは?
2013-03-28 08:22:20@kazu_yamamoto 『「関数プログラミングでは if を使わない」という誤解』が実在するんでしょうか?(そのリンク先はそんなことは言っていない気が。)
2013-03-28 09:49:06.@tomooda @esumii うーん。この記事に関しては僕が深読みし過ぎているのかなぁ。でも、「関数プログラミングでは for も if も使わない」って表現は、最近ちょくちょく見るようになりました。
2013-03-28 10:14:01for の方は、「反復には根源的には再帰を使う」という意味ならいいんですが。でも、OCaml には for 式があるしなぁ。
2013-03-28 10:17:05if の方は、「分岐がない」という意味なら間違いですねぇ。僕の書く Haskell のコードには if はほとんど使われてませんが、分岐はもちろん使われています。
2013-03-28 10:18:18@kazu_yamamoto @tomooda 具体例を見ないと何とも言えませんが勝手に想像すると、(1) ifやforもλ式で表す『ことができる』、(2) ifの代わりにパターンマッチングを、forの代わりに再帰を「しばしば」使う、とかを誤解されてしまったのかもしれませんね
2013-03-28 10:21:19Haskell の場合、if も、トップレベルの分岐も、ガードも、すべて case 式の構文糖衣です。Haskell には、ラムダ式に case を加えた拡張ラムダ式が根底にあります。
2013-03-28 10:24:20@esumii @kazu_yamamoto 元リンクは知らないけれど if なし for なし while なし、はここ最近加わった「関数型幻想」の一つでウォッチャーとして注目しています
2013-03-28 10:30:51少なくともErlangではifもforもwhileもありませんね。コンパイラはifをサポートしていますがifを使っているコードがあったら7割以上の確率で糞コードです
2013-03-28 10:35:02「関数プログラミングではforもifも使わない」ってのは、その字面通り、for文もif文も使わない、と言っているのだと思う。そんなこと言ってる人がいるかどうかは置いといて。
2013-03-28 11:19:15で、まぁそんなこと言ってる人がいるとしたら、「関数プログラミングでは(それが出来る場合は)forもifも使わない」とかそんなニュアンスだと思う
2013-03-28 11:20:34プログラムを実行する機械は手続き的なのだから、処理系ががんばるとかいう話は置いておくと、低レベル寄りのコードはifやfor使った方がいい場合ももちろんあるだろう
2013-03-28 11:22:19静的型付きの言語に限ると、「match式(もしくはcase式)が使えるのであれば、if式ではなくそちらを使う」っていうのはそれなりに正しい気はする。そして、高レベル寄りでは「match式が使えるように設計する」という力が働きやすいとかそんな感じ?
2013-03-28 11:26:00誤解のないように言っておきますが、元の記事の内容は素晴らしいです。ただ、最近 for/if の誤解を目にしていたので、著者の方がそいう誤解をしてないといいなぁと思ったのでした。 http://t.co/ddwgDeeDwE
2013-03-28 12:10:15.@bleis 前提が共有されていないのかもしれませんが、Haskell だと if は case の糖衣構文で、case でも書けます。こういうときも、1) case を使うのか、2) if でいいのか、3) ガードにすべきなのか、どう考えているのかなと。
2013-03-28 13:40:35.@bleis ちなみに僕の場合は、ガードにするか、補助関数を書いて関数の引数でのパターンマッチにすることが多いです。do 式の中では、妥協して if も (let も)使うことがあります。
2013-03-28 13:43:22.@bleis すいません。せめている訳ではなくて、どういう流儀でプログラミングをしているのか知りたかったのです。本当に単なる質問です。
2013-03-28 13:34:36@kazu_yamamoto boolに対して直接パターンを書くことは少ない気がします(型を導入してしまう)。ifを使うのは、boolを返す関数とともにですね。ガードはあまり使いません。
2013-03-28 13:47:54