見出し画像

OCamlでプログラミングを学んでいます(命令)

 「表現力と安全にこだわった仕事で使える関数型言語」OCamlによるプログラミング学習の最終回です。テキストは、公式ページのOCamlとの初日です。
 内容は、OCamlでの命令型プログラミングについてのまとめですが、また投げ出したので途中までです。

命令または手続き

 OCamlは、単なる関数型言語ではなく、命令型のプログラミングにも対応している。
 (命令型プログラミングの特徴は、データが変更可能、関数が副作用を持つなどです。OCamlでは変更可能なデータ構造として、参照、配列、変更可能レコードがあります。)

参照

 参照は、プログラム全体を通して割当ておよび変更が可能な変数が欲しいときに、用いることができる。
 整数についての参照を例に説明する。以下に参照の作成、代入、読み出しを示す。

ref演算子による生成
# let r = ref 0;;
val r : int ref = {contents = 0}

:=演算子による代入
# r := 100;;
- : unit = ()

!演算子による読み出し
# !r;;
- : int = 100

 (参照も一応あるけど、よく使うのはlet…inのほうだ、みたいなことが書いてあるような、ないような。)

順次実行

 ;により複数の命令型動作を組み合わせることができる。
 (関数が副作用を持つ場合、実行される順序が重要になるので、その順序を;で制御します。)
 これについて、二つの参照の内容を交換する関数swapを例に説明する。

定義
# let swap = fun a b ->
let tmp = !a in
(tmpにaの値が束縛された環境を作ります)
 a := !b;
(aにbの値を破壊的に代入します)
 b := tmp;; 
(bにtmpの値を破壊的に代入します)
val swap : 'a ref -> 'a ref -> unit = <fun>
(仮に、bの破壊的代入がaの破壊的代入の前に実行されると、aとbの値が同じ(元のaの値)になってしまいます。そのため;による代入順の制御が必要になります。)
適用
# let p = ref 0;;
val p : int ref = {contents = 0}
# let q = ref 1;;
val q : int ref = {contents = 1}
# swap p q;;
- : unit = ()
# !p;;
- : int = 1
# !q;;
- : int = 0

unit型

 前の例に示すように、swapの関数適用による返り値の型は、unit型である。
 unit型の値は、ただ一つしかなく、()で表される。
 この()は、引数を必要としない関数への形式的な引数として用いられる。その関数は、副作用のためにのみ呼び出される関数であり、例えば、画面出力のための関数print_newlineである。

# print_newline;;
- : unit -> unit = <fun>
# print_newline ();;

- : unit = ()

for

 一般的な命令型の繰り返し構造も可能。
 forループはこれね!

# let table n =
for row = 1 to n do
 for col = 1 to n do
  print_string (string_of_int (row*col));
  print_string " ";
 done;
 print_newline ();
done;;
val table : int -> unit = <fun>
# table 2;;
1 2
2 4
- : unit = ()

while

 whileループはここ!所与の数以上の2の冪を計算する関数を記述するために使ったよ。
 (いや、while構文の説明してよ。「ボクが作った最強関数」の説明してもしかたないでしょ…)
 OCamlは、ここまでですね。

まとめ

 今回は、OCamlにおける命令型プログラミングについて学びました。
 また、後半から説明が雑になって、例示だけで済まそうとするので、もうウンザリです。数表の例も、無駄に大きく10x10で、何がしたいのか理解できません(記事では2x2にしています)。

OCamlの学習で得た成果

 ここまでのOCamlの学習を通して、
  素人が書いた文章は、出来不出来の波が激しく、内容が独り善がりになりがちだ
ということが分かりました。OCaml関係ないですね。
 えっ?私の文章は、海底を這っているので波はありませんよ。それに、 妄想上の読者イマジナリーリーダーしかいないので、独り善がりになることもありません。皆さん絶賛してくれます。

今後の方針

 言語を選ぶ基準に、
 ・編集が入っていそうな無料公開されている入門書がある
を入れたいと思います。
 また、入門書は、公式ページからのリンクを辿るだけでなく、広くネットから探したいと思います。

 次回は、三度の挫折を経た末に奇跡的に出会った入門書が実は 魔導書 グリモアで初めて出会った幼なじみとともにオレは異世界に…



古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。