「関数プログラミングでは if を使わない」という誤解はどこから?

6
リンク はてなダイアリー Javaだって関数型言語に負けないぐらい魅力的:オブジェクト指向だけで計算してみる - ようじょと結婚したい HaskellやScalaなどで一躍大人気となった関数型言語には、その根底に型付きラムダ計算という計算体系の理論..
山本和彦 @kazu_yamamoto

教えて:「関数プログラミングでは if を使わない」という誤解はどこからくるの? たとえば、 http://t.co/ddwgDeeDwE だと Featherweight Java を根拠にしているみたいだけど、if がある世界にオブジェクトを追加しているでは?

2013-03-28 08:16:18
極端流形式仕様 初代𝕍𝕚𝕖𝕟𝕟𝕒𝕋𝕒𝕝𝕜𝕖𝕣 @tomooda

@kazu_yamamoto そのリンク先の文章は「オブジェクト指向ではifは言語要素として不要である」と言ってるだけでは?

2013-03-28 08:22:20
S (ツイートはスレッド全体をご確認ください) @esumii

@kazu_yamamoto 『「関数プログラミングでは if を使わない」という誤解』が実在するんでしょうか?(そのリンク先はそんなことは言っていない気が。)

2013-03-28 09:49:06
山本和彦 @kazu_yamamoto

.@tomooda @esumii うーん。この記事に関しては僕が深読みし過ぎているのかなぁ。でも、「関数プログラミングでは for も if も使わない」って表現は、最近ちょくちょく見るようになりました。

2013-03-28 10:14:01
山本和彦 @kazu_yamamoto

for の方は、「反復には根源的には再帰を使う」という意味ならいいんですが。でも、OCaml には for 式があるしなぁ。

2013-03-28 10:17:05
山本和彦 @kazu_yamamoto

if の方は、「分岐がない」という意味なら間違いですねぇ。僕の書く Haskell のコードには if はほとんど使われてませんが、分岐はもちろん使われています。

2013-03-28 10:18:18
S (ツイートはスレッド全体をご確認ください) @esumii

@kazu_yamamoto @tomooda 具体例を見ないと何とも言えませんが勝手に想像すると、(1) ifやforもλ式で表す『ことができる』、(2) ifの代わりにパターンマッチングを、forの代わりに再帰を「しばしば」使う、とかを誤解されてしまったのかもしれませんね

2013-03-28 10:21:19
山本和彦 @kazu_yamamoto

Haskell の場合、if も、トップレベルの分岐も、ガードも、すべて case 式の構文糖衣です。Haskell には、ラムダ式に case を加えた拡張ラムダ式が根底にあります。

2013-03-28 10:24:20
Jun Furuse 🐫🌴 @camloeba

@esumii @kazu_yamamoto 元リンクは知らないけれど if なし for なし while なし、はここ最近加わった「関数型幻想」の一つでウォッチャーとして注目しています

2013-03-28 10:30:51
kuenishi @kuenishi

少なくともErlangではifもforもwhileもありませんね。コンパイラはifをサポートしていますがifを使っているコードがあったら7割以上の確率で糞コードです

2013-03-28 10:35:02
ぐるぐる系SQL @bleis

「関数プログラミングではforもifも使わない」ってのは、その字面通り、for文もif文も使わない、と言っているのだと思う。そんなこと言ってる人がいるかどうかは置いといて。

2013-03-28 11:19:15
ぐるぐる系SQL @bleis

ただ、アプリケーションよりのプログラムを書いているのか、低レベルよりのプログラムを書いているのかで事情はかなり変わるはず

2013-03-28 11:21:07
ぐるぐる系SQL @bleis

で、まぁそんなこと言ってる人がいるとしたら、「関数プログラミングでは(それが出来る場合は)forもifも使わない」とかそんなニュアンスだと思う

2013-03-28 11:20:34
ぐるぐる系SQL @bleis

プログラムを実行する機械は手続き的なのだから、処理系ががんばるとかいう話は置いておくと、低レベル寄りのコードはifやfor使った方がいい場合ももちろんあるだろう

2013-03-28 11:22:19
ぐるぐる系SQL @bleis

静的型付きの言語に限ると、「match式(もしくはcase式)が使えるのであれば、if式ではなくそちらを使う」っていうのはそれなりに正しい気はする。そして、高レベル寄りでは「match式が使えるように設計する」という力が働きやすいとかそんな感じ?

2013-03-28 11:26:00
山本和彦 @kazu_yamamoto

誤解のないように言っておきますが、元の記事の内容は素晴らしいです。ただ、最近 for/if の誤解を目にしていたので、著者の方がそいう誤解をしてないといいなぁと思ったのでした。 http://t.co/ddwgDeeDwE

2013-03-28 12:10:15
山本和彦 @kazu_yamamoto

.@bleis 真理値の分岐にも match を使うんですか?

2013-03-28 12:08:12
ぐるぐる系SQL @bleis

@kazu_yamamoto 言葉が足りてないのは認めますが、そう読めますか?であれば申し訳ないです。

2013-03-28 13:06:36
山本和彦 @kazu_yamamoto

.@bleis 前提が共有されていないのかもしれませんが、Haskell だと if は case の糖衣構文で、case でも書けます。こういうときも、1) case を使うのか、2) if でいいのか、3) ガードにすべきなのか、どう考えているのかなと。

2013-03-28 13:40:35
山本和彦 @kazu_yamamoto

.@bleis ちなみに僕の場合は、ガードにするか、補助関数を書いて関数の引数でのパターンマッチにすることが多いです。do 式の中では、妥協して if も (let も)使うことがあります。

2013-03-28 13:43:22
山本和彦 @kazu_yamamoto

.@bleis すいません。せめている訳ではなくて、どういう流儀でプログラミングをしているのか知りたかったのです。本当に単なる質問です。

2013-03-28 13:34:36
ぐるぐる系SQL @bleis

@kazu_yamamoto boolに対して直接パターンを書くことは少ない気がします(型を導入してしまう)。ifを使うのは、boolを返す関数とともにですね。ガードはあまり使いません。

2013-03-28 13:47:54