以前の例だと for ループが使われているなど、命令的な構文が出てきていまいち、F# らしからぬところがあった。より、F# らしく書き直した例を示す。 手直しした場所は for ループの使用を廃止し、再帰呼び出しに書き換えている。この再帰呼び出しは末尾再帰で最適化できるので実際に出力される MSIL コードはループとなっている。F# は他の関数型言語同様に末尾再帰はループに書き換えるので、きちんと考えられていれば再帰でスタックを浪費することはない。
open System.Collections.Generic
open Int32
open Big_int
let skills = [|"お豆腐の買い方"; "鉛筆の買い方"; "消しゴムの使い方"; "メモの取り方"; "攻撃に使えないこともない呪文"; "裏町の歩き方"; "森林浴"; "珈琲の味"; "しじみのみそ汁の作り方"; "回覧板の回し方"; "郵便物の投函方法"; "立ち話のコツ"; "猫の呼び方"; "犬の呼び方"; "カラスの呼び方"; "鳩専用豆鉄砲"; "秘密の趣味"; "速く走るコツ"; "剣の使い方"; "斧の使い方"; "まきわりで、まっきわりわり"; "聖なる祈り"; "孤独"; "涼しく過ごすコツ"; "お洒落のコツ"; "卵をふわっと焼く方法"; "ごはんの研ぎ方"; "油汚れの対応方法"; "大人の振るまい"; "Suicaの使い方"|];;
computeEx (current + 1) maximum;
System.Console.WriteLine("{0}の経験値を得た。", e.[current - 1]);
System.Console.WriteLine("勇者は{0}にレベルが上がった!", current);
System.Console.WriteLine("勇者は、{0}を覚えた。", skills.[r3]);
leveling 1 29;
let r1 = random.Next(monsters.Length) in
System.Console.WriteLine("{0}の経験値を得た。", e.[29]);
System.Console.WriteLine("勇者は、また、レベルが上がった!");
System.Console.WriteLine("勇者は、ふと空しさを覚えた。");;
非同期実行を使った改訂版を作ってみました。

