| パラダイム | マルチパラダイム:機能的、命令的 |
|---|---|
| 家族 | ML |
| デザイン: | ジェラール・ユエ、ギー・クジノー、アスカンデル・スアレス、ピエール・ヴァイス、ミシェル・モーニー(ヘビー・キャムル)、ザビエル・ルロワ(キャムル・ライト) |
| 開発者 | インリア、ENS |
| 初登場 | 1985年 |
| 安定リリース | 0.75 [1]
/ 2002年1月26日 |
| タイピングの規律 | 推測、静的、強い |
| メモリ管理 | 自動 |
| OS | クロスプラットフォーム: Unix、Linux、macOS、Windows |
| ライセンス | QPL 1、LGPL 2 (Caml Light) |
| Webサイト | caml.inria.fr |
| 影響を受けた | |
| ML | |
| 影響を受けた | |
| オカムル | |
Caml (元々はCategorical Abstract Machine Languageの頭字語) は、マルチパラダイム、汎用、高水準、関数型 プログラミング言語であり、 ML プログラミング言語ファミリーの方言です。Caml は、フランスのフランス情報処理自動化研究所(INRIA) とパリ高等師範学校(ENS)で開発されました。
Caml は静的に型付けされ、厳密に評価され、自動メモリ管理を使用します。Camlの主な後継であるOCaml は、オブジェクト指向プログラミング(オブジェクト) レイヤー を含む多くの機能を言語に追加します。
例
以下では、#Caml プロンプトを表します。
こんにちは世界
「Hello, World!」プログラムは次のとおりです。
print_endline "こんにちは、世界!" ;;
階乗関数(再帰と純粋関数型プログラミング)
階乗などの多くの数学関数は、純粋に関数的な形式で表現するのが最も自然です。次の再帰的で純粋に関数的な Caml 関数は、階乗を実装します。
rec fact n = n = 0の場合は 1 、それ以外の場合はn * fact ( n - 1 )とします。
この関数は、パターンマッチングを使用して同等に記述できます。
rec fact = function
| 0 -> 1
| n -> n * fact ( n - 1 )とします。
後者の形式は、階乗を再帰関係として数学的に定義したものです。
コンパイラはこの関数の型を と推論したことに注意してください。つまり、この関数は int を int にマッピングします。たとえば、12! は次のようになります。
int -> int
# 事実 12 ;;
- : int = 479001600
数値微分(高階関数)
Caml は関数型プログラミング言語なので、Caml プログラム内で関数を作成して渡すのは簡単です。この機能は、非常に多くの用途に使用できます。関数の数値微分を計算するのはその一例です。次の Caml 関数は、d特定の関数のf特定の点における数値微分を計算しますx。
d delta f x =
( f ( x +. delta ) -. f ( x -. delta )) /. ( 2 . *. delta )とします。
この関数には小さな値が必要です。デルタにはマシンイプシロンdeltaの 3 乗根が適しています。[引用が必要]。
関数 の型は、を 型の別の関数に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」と呼ばれます。さらに、引数dを省略して を適用することで、f の (近似) 導関数を作成できますx。
# let f' = d ( fun x -> x *. x *. x -. x -. 1 .) ;;
val f' : float -> float = < fun >
カリー化関数と高階関数の概念は、数学プログラムでは明らかに役立ちます。これらの概念は、他のほとんどのプログラミング形式にも同様に当てはまり、コードをより積極的に分解するために使用でき、結果としてプログラムが短くなり、バグが少なくなります。
離散ウェーブレット変換(パターンマッチング)
整数の 2 のべき乗の長さのリストに対する 1D Haar ウェーブレット変換は、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に名前が変更されました。
参照
参考文献
- ^ 「最新の Caml Light リリース」 。2020年2 月 22 日閲覧。
- ^ abc 「Caml の歴史」、inria.fr
文献
- Caml によるプログラミングへの関数型アプローチは、Guy Cousineau と Michel Mauny によってWayback Machineに 2007-12-24 にアーカイブされました。
- Cardelli, Luca (1984)。関数型言語のコンパイル、ACM Symposium on LISP and functional programming、Association of Computer Machinery。
外部リンク
- 公式ウェブサイト、INRIA
