ja » the_basics

(Redirected from basics(ja))

コメント

OCamlのコメントは(**)で囲まれた部分である。

(* これは一行だけのコメント *)

(* これは
 * 複数行に渡る
 * コメント
 *)

別の言い方をすると、コメントの仕方はCに昔からあるコメント文によく似ている。(/* ... */)

関数呼び出し

さて、何か関数を定義したとしよう。例えばrepeatedという関数を定義したとする。これは文字列sと整数nを引数にとり、sn回繰り返した新しい文字列を返す関数とする。

Cに由来するほとんどの言語では、この関数を呼び出すときにはこのようにする。

repeated ("hello", 3)  /* Cコード*/

これは、「関数repeatedを2つの引数により呼び出す。最初の引数は文字列helloであり、二番目の引数は3である」ことを意味する。

ところが、OCamlやその他の関数型言語では関数呼び出しを違ったように書く。特に括弧のつけ方が異なり、間違いの元になりやすい。上と同じ関数呼び出しをOCamlで書くと、

repeated "hello" 3  (* OCamlコード *)

括弧がないこと引数の間のコンマがないことに注意しよう。

ややこしいことに、repeated ("hello", 3)はOCamlでちゃんとした意味がある。これは「関数repeated一つの引数で呼び出す。引数は文字列helloと整数3の組である。」を意味する。もちろんこれは誤りである。repeatedは2つの引数を取り、しかも最初の引数は文字列であって組ではないからだ。しかしとりあえず組(tuple)については考えないことにしよう。まず引数のまわりを括弧でくくらないこと、引数をコンマで分けないことを覚えよう。

さて次に別の関数を考えよう。get_string_from_userはユーザーから文字列の入力を受け、入力された文字列を返す関数である。この関数の戻り値をrepeatedに渡したい。CとOCamlのコードを比較しよう。

/* Cコード: */
repeated (get_string_from_user ("Please type in a string."), 3)
(* OCamlコード: *)
repeated (get_string_from_user "Please type in a string.") 3

括弧のつけ方とコンマの有無に注意してほしい。一個で言うと「関数呼び出し全体を括弧でくくる。引数の周りには括弧はつけない。」ということになる。さらに例を示そう。

f 5 (g "hello") 3    (* fの引数は3つ。gは一つ *)
f (g 3 4)            (* fの引数は一つ。gは2つ。*)

# repeated ("hello", 3);;     (* エラーになる。 *)
This expression has type string * int but is here used with type string