命令型プログラミング

目次

概要

命令型プログラミングではプログラムに状態を持ち、それを命令によって変化させることによってプログラムを記述していきます。

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

繰り返し

同じような処理を繰り返すことは冗長なので、 プログラミング言語のほとんどに、繰り返しを記述する構文が用意されています。
F# では 『for』 と 『while』 の2種類の構文が用意されています

for

書式
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 には、もうひとつ書式があります。
書式
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は条件が成立している間、処理を繰り返すための構文です。

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
inserted by FC2 system