はじめての OCaml (4) - 関数 - 備考録とエトセトラ
OCamlには、処理をひとまとめにした関数が存在します。
ただし、手続き型言語の関数とは少し扱いが違うので、注意が必要です。
関数の定義
関数を定義するには、letキーワードを使います。
以下では、引数をひとつ(x)とる関数funcを定義しています。
let func x = x + 1;;
最小の関数
文字列的な意味で最小の関数は、以下のとおり。
(* 1 を返す関数 func の定義 *)
let func = 1;;
一見変数のようですが、以下のようにしても文法エラーにはなりません。
(* 1 を返す関数 func の定義 *)
let func = 1;;
(* 関数 func の実行*)
func;; (* - : int = 1 *)
以下の代入処理は、文法エラーになります。
(* x の定義 *)
let x = 1;;
(* x への代入 *)
x <- 2;; (* Error: The value x is not an instance variable *)
OCamlでは、変数を関数で表現しているといってよいと思います。
(ツッコミある場合はお待ちしています。)
余談
手続き型言語に慣れていると代入のように見えますが、以下は等値比較と認識されます。
その為、falseが返ってきます。
(* x の定義 *)
let x = 1;;
(* x への代入、のようで実はxが2かどうかの比較になっている *)
x = 2;; (* - : bool = false *)
値を返さない関数
C言語とかでいうvoid関数。
let x = ();;
()はunitといって、C言語でいうvoidに相当します。
副作用だけを使い、戻り値は必要ない場合に使うことになると思われます。(主にIO周り)
再帰関数
再帰関数はOCamlにおいて特殊な関数と位置付けられているようで、letキーワードのみでは定義できません。
(末尾最適化の都合でしょうか?)
再帰関数を定義する場合は、letキーワードに続けてrecキーワードを使います。
(* 階乗関数の定義 *)
let rec fact n =
if n = 0 then 1
else n * fact (n-1);;
fact 5;; (* - : int = 120 *)
blog comments powered by Disqus