アカウント名:
パスワード:
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
目玉の数さえ十分あれば、どんなバグも深刻ではない -- Eric Raymond
まじめな話 (スコア:1)
元ネタのリンクを見てみたけれど、英語がよーわからんので いまいちピンと来ません。
# っつう人が多いから『おもしろおかしい』ネタばかり増えるんだろうけど。
誰か「こんな感じ」っての、教えてよ。
Re:まじめな話 (スコア:2, 参考になる)
直和型について、何がよいのかを C と比較して例だけ書いてみます。「x+y」のような「数式」を扱うプログラムを書いているとして、型 expr を
type expr = Const of int | Var of string | Plus of expr * expr | Times of expr * expr
のように定義しておくと、 Const(100) とか Plus(Var("x"), Var("y")) とかが expr 型の値として使えるようになります。
C で同じようなことをするなら、
struct expr {
int tag; /* 0:Const, 1:Var, 2:Plus, 3:Times */
union {
int cnst; /* tag==0 のとき有効 */
char *var; /* tag==1 のとき有効 */
struct { /* tag==2 || tag==3 のとき有効 */
expr *x;
expr *y;
} operands;
};
};
のようになるでしょう。 tag の値が0以上3以下であることや、 tag の値と他のフィールドの使いかたが合っていることは、プログラマが注意していなければなりません。
とくに、この型の値を受け取って処理するとき、 C では switch 文を使って書くことになると思いますが、そうして書かれたプログラムを読む際は、「この switch 文は本当にすべての場合を処理しているのだろうか?」ということを人間が意識しながら読まなければならず、負担がかかります。
このようなとき、 Caml ではパターンマッチ(match 式)という構文を使って書きます。すべての場合を処理しないパターンマッチは普通使わないので、コンパイラが警告を出してくれます。そのため、警告が出ないよう行儀よく書かれたプログラムを読む際、パターンマッチですべての場合が尽くされていない可能性を心配する必要がありません。
直和型だけだと「Pascal でいいじゃん」と言われるかもしれませんが、 Caml はほかにもいろいろ素晴らしいです。高階関数の扱いが簡単なのもいいです。
鵜呑みにしてみる?