2007-07-25

[日記]ocaml勉強

初めてのプログラムとしてこんなのを書いた。これを書くのに2時間ぐらいかかった。
こんな書き方でいいのか非常に不安だ。だれか「勝手に添削」とかしてくれないだろうか。

今日の感想
* Pythonのようにimport文が不要なのはちょっと違和感がある。
* コーディングスタイルがわからない。ocamlにはPEP8みたいのがないだろうか。
* 「引数をとらない関数」って意味あるの?関数型言語ではそういう関数には意味ないような気もしてきた。これは深い話だろうからよく考えてみよう。
* 繰り返しの入出力を扱う場合にも再帰で書くんだろうね。ここで一瞬思ったのは、関数が(入出力の内容によって)毎回違う内容を返すのは変じゃなかろうかということ。これがおそらく(想像だけど)Haskellがmonadを持ち出す理由の一つなんだろうか。うーん難しい。
* 最後に「当たり」と表示する時に、"当たり¥n"というふうに改行を出力しないと画面に表示されないというところではまった。


(* 数字あてゲーム! *)

Random.self_init();;

let suuji = Random.int(100);;

let get_string_from_user kaisu question =
begin
Printf.printf "[%d] %s> " kaisu question;
read_line ()
end;;

let atetene num = suuji - num;;

let rec readinp kaisu =
let inp = get_string_from_user kaisu "数字は何でしょう" in
let ans = atetene (int_of_string inp) in
if ans = 0
then
print_string "当たり\n"
else if ans > 0
then begin
print_string "もっと大きいよ\n";
readinp (kaisu + 1)
end
else begin
print_string "もっと小さいよ\n";
readinp (kaisu + 1)
end;;

readinp 1;;