Skip to content

step7 whileによるループ処理とmutableな変数

Step 6 では、関数の定義方法を学び、判定ロジックを関数に切り出した。 このステップでは、F#におけるループ処理の基本であるwhile式と、変更可能な変数mutableについて学び、ユーザーが繰り返し入力できるように数当てゲームを改良する。

while 式

F#でループ処理を行うには、主に再帰関数を使用するが、while式を使って命令型のループを記述することもできる。 while式の基本的な構文は以下の通りだ。

while 条件式 do
ループ本体

whiledoは予約語である。 条件式はbool型の値を返す式である。 ループ本体は、条件式がtrueである間、繰り返し実行される。

例えば、1 から 5 までの数字を出力するループは以下のように書ける。

let mutable i = 1
while i <= 5 do
printfn "%d" i
i <- i + 1

この例では、mutableキーワードを使って変更可能な変数iを宣言している。 whileループの中で、iの値を 1 ずつ増やしながら、printfnで出力している。 <-は、mutable変数に新しい値を代入するための演算子である。

仮に、これを TypeScript で記述すると以下のようになる。

let i = 1;
while (i <= 5) {
console.log(i);
i++;
}

mutable 変数

F#では、letで束縛された変数は、デフォルトでイミュータブル(変更不可)である。 しかし、mutableキーワードを使うと、ミュータブル(変更可能)な変数を作成できる。

let mutable 変数名 = 初期値

mutable変数の値を変更するには、<-演算子を使用する。

変数名 <- 新しい値

例えば、先ほどの例のimutable変数である。

let mutable i = 1
while i <= 5 do
printfn "%d" i
i <- i + 1 // iの値を更新

i <- i + 1の部分で、iの値を 1 ずつ増やしている。

ループ条件に mutable 変数を使用する

while式のループ条件には、mutable変数を使用できる。 これを利用して、ユーザーが正解するまで繰り返し入力を促すように、数当てゲームを改良しよう。

まず、ループを制御するためのmutable変数isGameContinuedを定義する。 初期値はtrueとする。

let mutable isGameContinued = true

次に、while式を使って、isGameContinuedtrueである間ループを回す。

while isGameContinued do
// ループ本体

ループ本体では、ユーザーからの入力を受け取り、判定を行い、結果を表示する。 正解だった場合は、isGameContinuedfalseに設定してループを終了させる。

while isGameContinued do
printfn "数字を入力してください:"
let inputString = stdin.ReadLine()
let inputNumber = int inputString
let result = judge answer inputNumber
match result with
| TooBig -> printfn "大きすぎます!"
| TooSmall -> printfn "小さすぎます!"
| Correct ->
printfn "正解!"
isGameContinued <- false

Program.fs の全体像

ここまでの変更を適用したProgram.fsの全体像は以下のようになる。

type GameResult =
| TooBig
| TooSmall
| Correct
let judge answer input =
match compare input answer with
| 1 -> TooBig
| -1 -> TooSmall
| _ -> Correct
let answer = 42
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で実行してみよう。 ユーザーが正解するまで、繰り返し入力を促されるようになる。

まとめ

このステップでは、以下の内容を学んだ。

  • while式を使ったループ処理
  • mutableキーワードを使った変更可能な変数の宣言
  • <-演算子を使ったmutable変数の更新
  • ループ条件でのmutable変数の使用
  • ゲームの継続状態を表す変数の命名

while式とmutable変数を使うことで、命令型のループ処理を記述できるようになった。 ただし、mutable変数の多用は避け、可能な限りイミュータブルなデータ構造を使用することが推奨される。

次のステップでは、Open 宣言を使ってSystem名前空間をインポートし、ランダムな正解を生成するように数当てゲームを改良する。