Caml (元々はCategorical Abstract Machine Languageの頭文字をとった略語)は、マルチパラダイム、汎用、高水準、関数型プログラミング言語であり、MLプログラミング言語ファミリーの方言です。Camlは、フランスの情報科学・自動化研究所(INRIA)とパリ高等師範学校(ENS)で開発されました。
Camlは静的型付け言語であり、厳密な評価を行い、自動メモリ管理を採用しています。Camlの主要な後継言語であるOCamlは、オブジェクト指向プログラミング(オブジェクト)レイヤーなど、多くの機能をCamlに追加しています。
以下では、 は#Caml プロンプトを表します。
「ハローワールド!」プログラムとは:
print_endline "こんにちは、世界!" ;;階乗などの多くの数学関数は、純粋関数形式で表現するのが最も自然です。以下の再帰的な純粋関数型Caml関数は、階乗を実装しています。
let rec fact n = if n = 0 then 1 else n * fact ( n - 1 );;この関数は、パターンマッチングを用いて以下のように記述することもできます。
let rec fact = function | 0 -> 1 | n -> n * fact ( n - 1 );後者の形式は、階乗を漸化式として数学的に定義したものである。
コンパイラはこの関数の型を と推論したことに注意してください。つまり、この関数は整数を整数にマッピングします。たとえば、12! は次のようになります。int->int
#事実12 ;; - : int = 479001600Camlは関数型プログラミング言語であるため、Camlプログラム内で関数を作成したり、関数をやり取りしたりすることが容易です。この機能は非常に多くの用途があります。関数の数値微分を計算することもその一例です。次のCaml関数は、指定された関数の指定された点におけるd数値微分を計算します。fx
let d delta f x = ( f ( x +. delta ) -. f ( x -. delta )) /. ( 2 . *. delta );;この関数には小さな値が必要です。デルタの適切な選択肢は、機械イプシロンdeltaの立方根です。
関数の型は、それがを 型の別の関数にdマッピングすることを示しています。これにより、引数を部分的に適用することができます。この関数スタイルはカリー化として知られています。この場合、最初の引数を に部分的に適用して、より特殊化された関数を取得することが有効です。float(float->float)->float->floatdeltad
# let d = d ( sqrt epsilon_float );; val d : ( float -> float ) -> float -> float = < fun >推論された型は、置換が最初の引数としてdその型を持つ関数を期待していることを示していることに注意してください。 の導関数の数値近似を計算できます。float->floatでと:
# d ( fun x -> x *. x *. x -. x -. 1 .) 3 .;; - : float = 26 .正解は。
この関数は、別の関数( )を引数として受け取るため、d「高階関数」と呼ばれます。さらに、引数を省略して適用することで、f の(近似)導関数を作成できます。fdx
# let f' = d ( fun x -> x *. x *. x -. x -. 1 .) ;; val f' : float -> float = < fun >カリー化と高階関数の概念は、数理プログラミングにおいて明らかに有用です。これらの概念は、他のほとんどのプログラミング形式にも同様に適用でき、より積極的にコードを分解することで、より短いプログラムとより少ないバグを生み出すことができます。
整数の2のべき乗の長さを持つ数値リストの1次元ハールウェーブレット変換は、Camlで非常に簡潔に実装でき、リストに対するパターンマッチングの使用例として優れています。これは、先頭から要素のペア(と)を取り出し、それらの合計と差をそれぞれリストとに格納します。h1h2sd
# let haar l = let rec aux l s d = match l , s , d with [ s ], [] , d -> s :: d | [] , s , d -> aux s [] d | h1 :: h2 :: t , s , d -> aux t ( h1 + h2 :: s ) ( h1 - h2 :: d ) | _ -> invalid_arg "haar" in aux l [] [] ;; val haar : int list -> int list = < fun >例えば:
#ハール[ 1 ; 2 ; 3 ; 4 ; -4 ; -3 ; -2 ; - 1 ];; - : intリスト= [ 0 ; 20 ; 4 ; 4 ; -1 ; -1 ; -1 ; -1 ]パターンマッチングを用いることで、複雑な変換を明確かつ簡潔に表現することが可能になります。さらに、Camlコンパイラはパターンマッチングを非常に効率的なコードに変換し、場合によってはcase文で記述された同等のコードよりも短く高速なプログラムを生成します(Cardelli 1984、p. 210)。
最初の Caml 実装は、 1987 年にフランス国立情報学研究所(INRIA)の Ascánder Suárez によってLispで書かれました。[ 2 ]
後継のCaml LightはXavier LeroyとDamien DoligezによってC言語で実装され[ 2 ]、オリジナルはメモリとCPUの要求値が高いため「Heavy Caml」というニックネームが付けられました[ 2 ] 。
Caml Special Lightは、コア言語に強力なモジュールシステムを追加した、さらなる全面的な書き直し版でした。オブジェクト指向プログラミング(オブジェクト)レイヤーが追加され、 Objective Camlとなり、最終的にOCamlと改名されました。