基本

■式

OCamlのコーディングの基本は式を評価してその結果の値を求めます。
式とは数学や算数で使用される内容と同じです。
「1 + 1」や「関数名(引数)」などが式です。
「1 + 1」の式の評価の結果は「2」で、
関数も内部で処理が実行されてその結果が返ります。

	値 = 式(パラメータ(引数))

●式の特性
	式は数学で使用されている式と同等の意味を持ちます。
	なので、特定の式に対して同じパラメータを渡した場合は
	必ず同じ値(結果)になるようにします。

	例1:
		式:
			1 + 1
		値:
			2

	例2:
		式:
			let addSum val1 val2 = val1 + val2
		値:
			val1とval2の和
		具体例:
			入力:
				let addSum val1 val2 = val1 + val2;;
				let sum = addSum 10 20;;
			結果:
				val sum : int = 30

		letについては変数の箇所で説明します。

■コメント

コメントとはソース上に記述するメモのことで、
コメントを書くことでソースの可読性が上がります。

●書式
	式:
		(* *)
	具体例:
		(* ここの部分がコメント *)

■データ型、演算子

OCamlではよく利用されるデータ型があります。

●型の種類
	・整数(int)
		整数は小数点を含まないデータ型で、最小と最大は32bitか64bitで異なります。
		max_int、min_intを使用することで確認が可能です。

	・実数(float)
		実数は小数点を含んだデータ型で、最大、最小の精度は
		max_float、min_floatで確認が可能です。

	・文字(char)
		文字は1文字を表すことができるデータ型で、
		文字を「''」で囲むことで表現します。
		ここでの文字は半角英数字(ASCIIコード)です。

	・文字列(string)
		文字列は複数の文字を表すことができるデータ型で、
		文字を「""」で囲むことで表現します。

		文字列の結合:
			文字列の結合は「^」を文字と文字の間に指定することで可能です。

			例:
				(* str = ABCDEF *)
				let str = "ABC" ^ "DEF"

	真偽値(bool):
		真偽値は真(true)と偽(false)のみをあらわすデータ型です。
		ifなどの条件式の判定の結果に使用されます。

●演算子の種類
	・計算演算子(整数)
		整数の四則演算を行う演算子です。
		「+、-、*、/」のいずれかの記号を整数と整数の間に
		入力することで行われます。

			例:
				(* sum = 20 *)
				let sum = 10 + 10

	・計算演算子(実数)
		実数の四則演算を行う演算子です。
		「+.、-.、*.、/.」のいずれかの記号を整数と整数の間に
		入力することで行われます。

			例:
				(* sum = 20.0 *)
				let sum = 10.0 +. 10.0

	・比較演算子
		比較演算子は値と値とを比較するための演算子です。

		>(>=):
			二つの値の大きさを比較します。
			左辺値のほうが大きければ真、小さければ偽です。
			「=」がついている場合は「右辺値以上」で真となります。

				例:
					10 > 5
					(* - : bool = true *)
		<(<=):
			二つの値の大きさを比較します。
			左辺値のほうが小さければ真、大きければ偽です。
			「=」がついている場合は「右辺値以下」で真となります。

				例:
					10 < 5
					(* - : bool = true *)
		=:
			二つの値が同じ値かどうかを比較します。
			同じ値だった場合は真、異なる値ならば偽です。

				例:
					10 = 10
					(* - : bool = true *)

			変数の再代入ができないのはlet式を使用しない「=」は
			比較を行っているためです。

				例:
					let sum = 10
					sum = 100
					(* - : bool = false *)
		<>:
			二つの値が別の値かどうかを比較します。
			異なる値ならば真、同じ値ならば偽と判定されます。

				例:
					10 <> 100
					(* - : bool = true *)
	
	・論理演算子
		論理演算子は条件式を詳細にするために使用される演算子です。
		複数の条件を設定する際によく使用されます。

		論理積:
			論理積は二つの条件式の間に「&&」を入力することで使用できます。
			両方の条件式が真ならば論理積の結果は真、
			それ以外は偽と判定されます。

				例:
					10 > 5 && 10 < 100
					(* 左右の条件式がともに真なので真 *)
					(* - : bool = true *)
			
		論理和:
			論理積は二つの条件式の間に「||」を入力することで使用できます。
			二つの条件式で1つでも真の結果があれば論理和の結果は真、
			なければ偽と判定されます。

				例:
					10 > 5 && 10 > 100
					(* 左の条件式が真なので真 *)
					(* - : bool = true *)
			
		否定:
			否定は条件式の結果を反転する場合に使用されており、
			条件式の前に「not」を入力することで使用可能です。
			結果の反転なので条件式が真ならば偽、偽ならば真となります。

				例:
					not (5 > 10)
					(* 条件式の結果「偽」を反転するので真 *)
					(* - : bool = true *)

●型推論
	OCamlのコンパイラには型推論という機能が実装されています。
	型推論とは変数や関数を宣言、定義、実行時に
	引数や戻り値などの値がどのデータ型であるかを自動的に判断してくれる機能です。
	対話式コンパイラで「1」や「1.0」を入力した場合に
	「int」や「float」と判断されているのは型推論によるものです。

●型チェック
	型チェックは定義された関数や計算をする際に
	指定されている型以外が使用されていないか判定する機能です。
	int型と値とfloat型の値を計算しようとするとエラーになるのは
	この型チェックの機能で異なる型と判断されているからです。

	メリット:
		型チェックはデータ型の扱いに強い制約をつけていますが、
		これによって、実行時のエラーが減少し、
		結果的にプログラムの信頼性が向上します。

■関数

OCamlでは特定の結果をだすための計算式をまとめたものを関数と呼んでいます。
この関数に求められる性質は「条件ならば同じ結果になる」というものです。
二つの整数を足す関数なら同じ値同士を足す場合
どんな状況でも必ず同じ値を返さなければいけません。

●書式
	・書式例
		let 関数名 引数 = 式

	・具体例
		let addSum va1 va2 = val1 + val2

		let sum = addSum 10 100
		(* sum = 110 *)

●関数定義後の内容
	関数が無事定義されると以下のような情報が表示されます。

		val 関数名 : 引数1の型 -> ... -> 引数nの型 -> 戻り値の型 = <fun>

	定義した関数を呼び出す場合はこの関数の情報通りに
	関数名や引数を指定しないとエラーになります。

●関数名
	関数名は小文字の英字から開始する必要があります。
	大文字の英字から開始するとエラーになるので注意が必要です。

	問題なし:
		let addSum val1 val2 = val1 + val2

	問題あり:
		let AddSum val1 val2 = val1 + val2

■変数

OCamlでは数値を保存するための領域として変数が用意されています。
この変数は宣言時の変数の名前と保存する数値の決定を行います。
その際に保存した値はそれ以降変更することはできません。
OCamlの変数は別の言語でいうところの定数の働きをします。

●変数の寿命
	変数には2種類の寿命が存在します。

	・グローバル変数
		グローバル変数は関数の外で定義された変数です。
		寿命としては宣言された位置からそのソースの終端までとなります。
		対話式コンパイラで「#」の次の位置から宣言した変数は
		グローバル変数として扱われます。

		書式例:
			let 変数名 = 値

		具体例:
			let pi = 3.14;;

	・ローカル変数
		ローカル変数は関数内で宣言された変数で、
		寿命は宣言した位置からその関数の終端まで使用することができます。
		書式は宣言の後ろに「in」と「式」を記述します。
		複数変数を宣言したい場合は式の後ろに更に「in」と「式」を追加します。

		書式:
			let 変数名 = 値 in 式
	
		具体例:
			(* 円周の長さを求める関数 *)
			let circumferenceLength rad = 
				let pi = 3.14 in
				let diameter = 2.0 *. pi in
				diameter *. rad

●注意点
	変数の値を変更することはできませんが、
	同じ名前の変数の宣言は何度も行うことが可能です。

		(* int型のtestを宣言して100を代入する*)
		let test = 100;;
		test;; (* - : int = 100 *)

		(* int型のtestを宣言して1000を代入する*)
		let test = 1000;;
		test;; (* - : int = 1000 *)

	これは変数の特性(一度代入したら変えられない)を損ない
	処理に混乱をもたらすので注意する必要があります。