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

Published

13 July 2017

Tags