Skip to content

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.RandomSystem 名前空間に属する Random クラスである。 一方、List は F# のモジュールであり、List.mapList モジュールで定義された map 関数である。

open 宣言は、名前空間とモジュールのどちらに対しても使用できる。

open System
open 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 には 1maxValue には 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
| _ -> Correct

Program.fs の全体像は以下のようになる。

open System
type 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です" answer
printfn "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 ループではなく、再帰関数を使って数当てゲームを改良する。