ML (プログラミング言語)
| ML | |
|---|---|
| パラダイム | 関数型、命令型 |
| 登場時期 | 1970年代 |
| 設計者 | ロビン・ミルナーおよびその他のエディンバラ大学の人物 |
| 型付け | 型推論をもつ、 強い静的型付け |
| 方言 | SML, OCaml |
| 影響を受けた言語 | ISWIM |
| 影響を与えた言語 | Miranda, Haskell, Cyclone, Nemerle |
ML(えむえる、Meta-Language)は、関数型言語のひとつである。現代風の関数型言語としては歴史が古いほうで、型推論機能などを持つが、デフォルトの評価戦略は遅延評価ではなく先行評価で、書き換えが可能なレコード型を持つなど、いわゆる「純粋関数型」でない特徴や機能を持つ。
目次 |
[編集] 概要
1974年、エディンバラ大学で開発されたEdinburgh LCF(Logic for Computable Function)という定理証明を支援するシステム(参考: 自動定理証明)を記述する言語として開発された。名前の由来(メタ言語)もこのことから来ている。構文はISWIMの影響を受けている。
MLによってプログラマに知られるようになった機能に、型推論がある。これは、明示的に型の宣言を行わなくても、データの利用のされ方から、引数や関数の返す型を自動的に推論してくれる機能である。これにより、プログラマの負担が著しく軽減される。
言語仕様は実装によって異なっており、各実装における仕様を、それぞれのMLの方言とみることもある。標準としてはStandard ML(SML)があり、その実装にはSML/NJ (Standard ML of New Jersey) などがある。他に有力なものには、グレートブリテンから海峡を渡ってINRIAで実装されたCaml(の発展であるOCaml)がある。他にMoscow ML、 MLton、LML (Lazy-ML - 遅延評価を取入れた) などがある。
[編集] 言語仕様
「Standard ML」も参照
以降の記法や名前はSMLのものである。ML系で近年有力なOCamlとは差異があるのでOCamlについてはOCamlの記事を参照のこと。
[編集] 演算子
MLの基本的な演算子は以下の通り
- + 加算, - 減算, * 乗算
- / 実数での除算, div 整数での除算, mod 剰余
- :: リストに要素を追加, @ リスト の結合
- ^ 文字列の連結, if~then~else if文(扱いは3項演算子)
[編集] 関数の定義
MLの関数の定義は
fun (関数名)(引数) = (内容);
と書く。PrologやHaskellと同様にMLでは引数の評価にパターンマッチングを用いることで複数に内容を分割できる。その場合は | を使用して分割する。
例として階乗を求めるプログラムを以下に示す。
fun factorial(1) = 1 | factorial(n) = n * factorial(n-1);
MLでの関数の評価は関数が定義されたときに行われる。このため ML では関数定義の順序が無視できない。例として
fun a(x) = b(x-1) + x;
fun b(x) = x * x;
のような関数がある場合は必ず b の方が先に定義されていないといけない。しかしこの場合はお互いを呼ぶような再帰呼び出しの実装が不可能である。そこで ML ではそのような関数のために二つの関数をandでつなぐことによってこれを実装することができる。 例を挙げると
fun take(nil) = nil | take(x::xs) = x::skip(xs) and skip(nil) = nil | skip(x::xs) = take(xs);
これは take が与えられたリストの奇数番目の要素を返し、skip が偶数番目の要素を返す関数である。
[編集] 参考文献
- UllmanJeffrey 『プログラミング言語ML』 神林 靖 訳、アスキー、東京、1996年3月。ISBN 4-7561-1641-8。