step8 openによるインポートとランダムな数値の生成
Step 7 では、while 式を使ったループ処理と mutable 変数について学んだ。
このステップでは、他のモジュールをインポートするための open 宣言と、ゲームの核となるランダムな数値の生成方法について学ぶ。
open 宣言
F#では、他のモジュールで定義された関数などを使用する際に、モジュール名を指定する必要がある。
例えば、System.Random クラスの Next メソッドを使用する場合、以下のように記述する。
let random = System.Random()let randomNumber = random.Next(1, 101)毎回モジュール名を指定するのは煩雑なため、open 宣言を使うことで、モジュール名を省略できるようになる。
open System
let random = Random()let randomNumber = random.Next(1, 101)open System と宣言することで、以降は System モジュール内の型や関数を、モジュール名の指定なしで使用できる。
名前空間とモジュール
open 宣言で指定する名前は、名前空間またはモジュールである。
.NET では、型や関数は名前空間で階層的に管理されている。
一方、F# では、名前空間に加えてモジュールを使って、型や関数をグループ化することもできる。
例えば、System は名前空間であり、System.Random は System 名前空間に属する Random クラスである。
一方、List は F# のモジュールであり、List.map は List モジュールで定義された map 関数である。
open 宣言は、名前空間とモジュールのどちらに対しても使用できる。
open Systemopen Listランダムな数値の生成
数当てゲームでは、1 から 100 までのランダムな整数を生成する必要がある。
F# でランダムな数値を生成するには、System.Random クラスを使用する。
まず、System.Random クラスのインスタンスを作成する。
open System
let random = Random()次に、Next メソッドを使って、指定した範囲のランダムな整数を取得する。
let randomNumber = random.Next(1, 101) // 1 以上 101 未満の整数Next(minValue, maxValue) は、minValue 以上 maxValue 未満のランダムな整数を返す。
数当てゲームでは、1 から 100 までの数を生成したいので、minValue には 1、maxValue には 101 を指定する。
以下のようにまとめて 1 行で書くこともできる。
let randomNumber = Random().Next(1, 101)Program.fs への適用
それでは、Program.fs を書き換えて、ランダムな数を生成するように変更しよう。
まず、System 名前空間を open する。
open System次に、Random クラスのインスタンスを作成し、それを使って answer を生成するようにする。
let random = Random()let answer = random.Next(1, 101)
let judge answer input = match compare input answer with | 1 -> TooBig | -1 -> TooSmall | _ -> CorrectProgram.fs の全体像は以下のようになる。
open Systemtype GameResult = | TooBig | TooSmall | Correct
let judge answer input = match compare input answer with | 1 -> TooBig | -1 -> TooSmall | _ -> Correct
let answer = Random().Next(1, 101)
printfn "正解は%dです" answerprintfn "1から100までの数字を入力してください。"
let mutable isGameContinued = true
while isGameContinued do let inputNumber = stdin.ReadLine() |> int let result = judge answer inputNumber
let message = match result with | TooBig -> "大きすぎます" | TooSmall -> "小さすぎます" | Correct -> isGameContinued <- false // ゲーム終了のフラグを立てる "正解です"
printfn "%s" message書き換えたら dotnet run で実行してみよう。
実行するたびに、異なるランダムな数が生成されるようになる。ここまでくれば、数当てゲームとして遊ぶことができるようになる。実際に遊ぶ場合は、正解を表示する部分をコメントアウトすると良いだろう。
まとめ
このステップでは、以下の内容を学んだ。
open宣言を使ったモジュールのインポート- 名前空間とモジュールの違い
System.Randomクラスを使ったランダムな数値の生成- 純粋関数を保つための関数の修正
open 宣言を使うことで、他のモジュールで定義された型や関数を簡単に利用できるようになった。
また、System.Random クラスを使って、ゲームの核となるランダムな数値を生成できるようになった。
そして、judge 関数を純粋関数として保つために、answer を引数として取るように修正した。
次のステップでは、while ループではなく、再帰関数を使って数当てゲームを改良する。