step7 whileによるループ処理とmutableな変数
Step 6 では、関数の定義方法を学び、判定ロジックを関数に切り出した。
このステップでは、F#におけるループ処理の基本であるwhile式と、変更可能な変数mutableについて学び、ユーザーが繰り返し入力できるように数当てゲームを改良する。
while 式
F#でループ処理を行うには、主に再帰関数を使用するが、while式を使って命令型のループを記述することもできる。
while式の基本的な構文は以下の通りだ。
while 条件式 do ループ本体whileとdoは予約語である。
条件式は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変数の値を変更するには、<-演算子を使用する。
変数名 <- 新しい値例えば、先ほどの例のiはmutable変数である。
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式を使って、isGameContinuedがtrueである間ループを回す。
while isGameContinued do // ループ本体ループ本体では、ユーザーからの入力を受け取り、判定を行い、結果を表示する。
正解だった場合は、isGameContinuedをfalseに設定してループを終了させる。
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 <- falseProgram.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です" 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で実行してみよう。
ユーザーが正解するまで、繰り返し入力を促されるようになる。
まとめ
このステップでは、以下の内容を学んだ。
while式を使ったループ処理mutableキーワードを使った変更可能な変数の宣言<-演算子を使ったmutable変数の更新- ループ条件での
mutable変数の使用 - ゲームの継続状態を表す変数の命名
while式とmutable変数を使うことで、命令型のループ処理を記述できるようになった。
ただし、mutable変数の多用は避け、可能な限りイミュータブルなデータ構造を使用することが推奨される。
次のステップでは、Open 宣言を使ってSystem名前空間をインポートし、ランダムな正解を生成するように数当てゲームを改良する。