命令型プログラミングではプログラムに状態を持ち、それを命令によって変化させることによってプログラムを記述していきます。
F#で命令型プログラミングをする為の機能を紹介します。
命令型、オブジェクト指向型のプログラミングをする際に、 参照やポインタが必要になってきます。
これらは、データの格納先を保持します。
例)
xという名前をつけたデータ領域を用意し、そこに10を格納する
let x = 10;;
ref で xという名前のデータ領域の場所を取り出し、yに束縛する
let y = ref x;;
イメージ y -> x = 10 ( y は、xを参照できるようになった )
下記に、具体的な使用方法を紹介します。
int型 x を定義し、その参照をint ref(参照)型のyに束縛します。
> let x = 10;; val x : int > let y = ref x;; val y : int ref
y を評価すると、どうなるでしょうか。
> y;; val it : int ref = {contents = 10;}
レコード型と良く似ています。 実は参照型はレコード型の特殊なものです。
yの参照する値は ! をyの前につけることで取り出すことができます。
> !y;; val it : int = 10
参照型は、:= によって参照先を変更することができます。
> y := 99;; val it : unit = null
変更されているか、確認してみます。
> !y;; val it : int = 99
for var = expr1 to expr2 do expr3 done
for i = 1 to 10 do printf "%d " i done;;
1 2 3 4 5 6 7 8 9 10
for var = expr1 downto expr2 do expr3 done
for i = 10 downto do printf "%d " i done;;
10 9 8 7 6 5 4 3 2 1
whileは条件が成立している間、処理を繰り返すための構文です。
while 条件 do 処理
whileの使用例を下記に示します。
counterが0より大きい(条件)間、counterの値を表示(処理)します。
サンプル
let counter = ref 5 while !counter > 0 do printfn "counter=%d" !counter counter := !counter-1
出力
counter=5 counter=4 counter=3 counter=2 counter=1
F#は非純粋型関数型言語なので、forやwhileなど副作用を伴う制御構造が用意されていますが、
純粋関数型言語では、別の方法でループ(繰り返し)を記述する必要があります。
その別の方法が、再帰によるループです。
関数型のアプローチでプログラミングする場合は、こちらを使うと良いでしょう。
サンプル
let rec loop i = printf "%d " i; if i <= 0 then 0 else loop (i-1);; loop 5;;
出力
5 4 3 2 1 0