whileループ
繰り返しの制御構文としては
forループの他にwhileループがあります。
whileは、式1がtrueである間、式2を実行し続けます。
- whileループ
-
while式 := while 式1 do 式2 done
軽量構文ではdoneを省略できます。
次の章で説明する参照型を用いれば
C言語などでよくある次のようなループを記述できます。
F#6から推奨される書き方が変わっています。
1から10まで表示するループ
let a = ref 0 in
while a.Value < 10 do
a.Value <- a.Value + 1
printfn "%d" a.Value
done;;
1から10まで表示するループ(軽量構文)
let a = ref 0 in
while a.Value < 10 do
a.Value <- a.Value + 1
printfn "%d" a.Value
以前のF#の1から10まで表示するループ
let a = ref 0 in
while !a < 10 do
a := !a + 1;
printfn "%d" !a
done;;
以前のF#の1から10まで表示するループ(軽量構文)
let a = ref 0 in
while !a < 10 do
a := !a + 1
printfn "%d" !a
しかし、F#ではあまりこういう書き方はしません。
値を変更可能な変数を用いたプログラムは
そうでないプログラムに比べて理解しにくく
バグを起こしやすいためです。
この例であれば、次のように書くのが簡潔です
F#でのループ処理
let print_int = printfn "%d" in
List.iter print_int [1..10]
List.iterは2つの引数を取り
1つめには1引数の関数、2つめにはリストをとる関数です。
処理としては
[1..10]で1から10までの数字からなるリストを生成し
List.iterでそれぞれ数字を引数にしてprint_intを呼び出しています。
print_intは数値を入力として受け取り、その数値を出力する関数になります。
F#を含め、関数型言語では、このiter関数のように
リストや配列の処理を行う関数が色々と用意されています。
これらを使いこなせるようになれば
whileなどのループを使う機会は少なくなると思います。
whileを使うと、計算が終わらない無限ループもかけてしまうので
気をつけないといけません。
無限ループ
while true do printfn "%s" "never finish" done;;
最後に、以下のプログラムをもってwhileループの説明を終わります。
週末まで計算するループ(参考:Expert F#)
open System;;
while(DateTime.Now.DayOfWeek<>DayOfWeek.Saturday) do
printfn "working";
done;;
printfn "result is 42"; //人生、宇宙、すべての答えでGoogle検索したら
週末まで計算するループ(軽量構文)
open System
while(DateTime.Now.DayOfWeek<>DayOfWeek.Saturday) do
printfn "working";
printfn "result is 42"; //人生、宇宙、すべての答えでGoogle検索したら