« CodeDom でコードを動的にコンパイルして実行する | メイン | IronRuby で Ruby on Rails が起動 »

「憂鬱な勇者」をより F# っぽく作ってみた

以前の例だと for ループが使われているなど、命令的な構文が出てきていまいち、F# らしからぬところがあった。より、F# らしく書き直した例を示す。 手直しした場所は for ループの使用を廃止し、再帰呼び出しに書き換えている。この再帰呼び出しは末尾再帰で最適化できるので実際に出力される MSIL コードはループとなっている。F# は他の関数型言語同様に末尾再帰はループに書き換えるので、きちんと考えられていれば再帰でスタックを浪費することはない。

open System
open System.Collections.Generic
open Int32
open Big_int
let monsters = [|"焼きたてパン"; "強いシャチホコ"; "もんじゃ焼き一年生"; "怪人ホタテ男"; "ニセ勇者"; "逃げ足の早いアレ"; "睡魔"; "煩悩"; "愛らしい子犬の中の人"; "恋するスズメバチ"; "勇敢なクマンバチ"; "信じられない物"; "勇者の師匠"; "浮遊する鎧"; "怪盗ドボン"; "闇の招き猫"; "誘惑のカスタードクリーム"; "しょっぱすぎる籠手"; "カレー味の兜"; "光沢だけは一流の盾"; "若葉マークのモンスター"; "新緑の季節"; "梅雨時の車両のニオイ"; "暑すぎる夏"; "新宿らしき何か"; "やたら発達したドーナツ"; "育ちすぎたクマー"; "なごやかな雰囲気"; "凍り付いた気配"; "忍び寄る恐怖"|];;
let skills = [|"お豆腐の買い方"; "鉛筆の買い方"; "消しゴムの使い方"; "メモの取り方"; "攻撃に使えないこともない呪文"; "裏町の歩き方"; "森林浴"; "珈琲の味"; "しじみのみそ汁の作り方"; "回覧板の回し方"; "郵便物の投函方法"; "立ち話のコツ"; "猫の呼び方"; "犬の呼び方"; "カラスの呼び方"; "鳩専用豆鉄砲"; "秘密の趣味"; "速く走るコツ"; "剣の使い方"; "斧の使い方"; "まきわりで、まっきわりわり"; "聖なる祈り"; "孤独"; "涼しく過ごすコツ"; "お洒落のコツ"; "卵をふわっと焼く方法"; "ごはんの研ぎ方"; "油汚れの対応方法"; "大人の振るまい"; "Suicaの使い方"|];;
let e = new List();;
let max_num = 30;;
let rec ex (r:big_int) current maximum =
if current < maximum then
ex (r * (big_int_of_int current)) (current + 1) maximum
else
r * (big_int_of_int current);;
let random = new Random();;
let rec computeEx current maximum =
if current <= maximum then begin
e.Add(ex (big_int_of_int 1) 1 current);
computeEx (current + 1) maximum;
end;;
let rec leveling current maximum =
if current <= maximum then begin
let r2 = random.Next(monsters.Length) in
let r3 = random.Next(skills.Length) in
System.Console.WriteLine("{0}を倒した!", monsters.[r2]);
System.Console.WriteLine("{0}の経験値を得た。", e.[current - 1]);
System.Console.WriteLine("勇者は{0}にレベルが上がった!", current);
System.Console.WriteLine("勇者は、{0}を覚えた。", skills.[r3]);
leveling (current + 1) maximum;
end;;
let main =
computeEx 1 30;
leveling 1 29;
let r1 = random.Next(monsters.Length) in
System.Console.WriteLine("{0}を倒した!", monsters.[r1]);
System.Console.WriteLine("{0}の経験値を得た。", e.[29]);
System.Console.WriteLine("勇者は、また、レベルが上がった!");
System.Console.WriteLine("勇者は、ふと空しさを覚えた。");;
Technorati tags:

非同期実行を使った改訂版を作ってみました。

このエントリーをはてなブックマークに追加 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 このエントリーをYahoo!ブックマークに追加

トラックバック

このエントリーのトラックバックURL:
http://www.cworld2000.com/cgi-bin/mt/mt-tb.cgi/427

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2008年06月02日 23:22に投稿されたエントリーのページです。

ひとつ前の投稿は「CodeDom でコードを動的にコンパイルして実行する」です。

次の投稿は「IronRuby で Ruby on Rails が起動」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

検索

この Weblog について

Creative Commons License
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.
Powered by
Movable Type 3.35