Standard_ML
[Wikipedia|▼Menu]

Standard MLパラダイムマルチパラダイム: 関数型命令型
型付け強い静的推論あり
主な処理系MLton, MLWorks, Moscow ML, Poly/ML, SML/NJ, SML.NET
方言Alice、Dependent ML
影響を受けた言語ML
テンプレートを表示

Standard ML (SML) は、プログラミング言語MLの標準ないし1方言である。The Definition of Standard ML で型付け規則と操作的意味論が与えられている。1990年に初版が出版され、1997年に単純化された改版が出版されている[1]
概要

Standard ML は基本的には関数型言語である。Standard ML で書かれたプログラムの大部分は、値を計算すべきで構成されている。

他の関数型言語と同様、Standard ML の鍵となる機能は関数であり、それによって抽象化を行っている。例えば、階乗関数は次のように表される。fun factorial x = if x = 0 then 1 else x * factorial (x-1)

Standard ML のコンパイラは、このようにユーザーが全くデータ型を指定していない記述から int -> int という型を静的に推論する必要がある。すなわち、x が整数の式でしか使われていないことから、それ自身も整数だと推論し、関数内の式で生み出される値も全て整数であると推論しなければならない。

同じ関数を節関数定義 (clausal function definition) で表現することもできる。その場合 if-then-else という条件分岐を 。で区切られた一連のテンプレートに置換し、個々のテンプレートは特定の値について評価される。各テンプレートは順番に試行され、一致するものを見つけることになる。fun factorial 0 = 1 。factorial n = n * factorial (n - 1)

局所関数を使い、この関数を末尾再帰に書き換えることもできる。fun factorial x = let fun tail_fact p 0 = p 。tail_fact p n = tail_fact (p * n) (n - 1) in tail_fact 1 x end

let-式の値は、 in と end に挟まれた式の値になる。
モジュールシステム

Standard ML には高度なモジュールシステムがあり、プログラムを論理的に関連する型と値の宣言の structure による階層に分解することができる。SMLモジュールは単に名前空間を制御するだけでなく、抽象化の役割も持っており、プログラマはこれを使って抽象データ型を定義できる。

主に3つの構文要素でSMLモジュールシステムが構成される。signature と structure と functor である。structure はモジュールそのものである。型、式、値、structure (substructure) の集合体であり、それらを1つの論理単位にパッケージ化している。signature はインタフェースであり、一般にその structure の型として認識される。その structure が提供する全ての実体の名前を指定し、型要素のアリティ、値要素の型、substructure の signature も指定する。型要素の定義はエクスポートする場合もしない場合もある。定義を隠蔽した型要素を「抽象型 (abstract type)」と呼ぶ。functor は structure から structure への関数である。すなわち、functor は1つ以上の引数を受け付け(通常、signature で指定した structure)、結果として structure を生成する。functor はジェネリックなデータ構造とアルゴリズムを実装するのに使われる。

例えば、キューデータ構造の signature は次のようになる。signature QUEUE = sig type 'a queue exception Queue val empty : 'a queue val insert : 'a * 'a queue -> 'a queue val isEmpty : 'a queue -> bool val peek : 'a queue -> 'a val remove : 'a queue -> 'a * 'a queueend

この signature はキューのパラメータ化された型 queue を提供するモジュールを記述しており、それには Queue という例外、キューの基本操作を提供する5つの値(うち4つは関数)を記述している。これを使ってキューデータ構造を実装した structure を書くことができる。structure TwoListQueue :> QUEUE = struct type 'a queue = 'a list * 'a list exception Queue val empty = ([],[]) fun insert (a,(ins,outs)) = (a::ins,outs) fun isEmpty ([],[]) = true 。isEmpty _ = false fun peek ([],[]) = raise Queue 。peek (ins,[]) = hd (rev ins) 。peek (ins,a::outs) = a fun remove ([],[]) = raise Queue 。remove (ins,[]) = let val newouts = rev ins in (hd newouts,([],tl newouts)) end 。remove (ins,a::outs) = (a,(ins,outs)) end

この定義では、TwoListQueue が QUEUE という signature の実装であることを宣言している。さらに(:> で指定されている) opaque ascription により、この signature(すなわち queue)で定義が提供されていない型要素は抽象型として扱うことを示している。すなわち、ここではキューが2つのリストで定義されているが、それはモジュール外部には見せない。structure 本体には signature に挙げられている全要素に対応した実装が記述される。

structure を使うには、ドット記法でその型や値といったメンバーにアクセスすればよい。例えば、文字列のキューの型は string TwoListQueue.queue、空のキューは TwoListQueue.empty、q というキューの最初の要素を削除するには TwoListQueue.remove q と書けばよい。
コード例

SMLの処理系の多くは対話型のトップレベルを備えており、それに入力することで、コード断片は容易に実行できる。これは、入力された式の型を推論し評価する。例えば、SML/NJ では、次のように起動する。 $ sml Standard ML of New Jersey v110.52 [built: Fri Jan 21 16:42:10 2005] -

コードは - のプロンプトの位置に入力する。例えば 1+2*3 を計算する場合、次のようになる。 - 1 + 2 * 3; val it = 7 : int

トップレベルは式の型が int であると推論し、その値 7 を表示している。
Hello world

次のようなプログラム hello.sml があるとする。print "Hello world!\n";

これをMLtonでコンパイルする場合、次のように入力する。$ mlton hello.sml

実行は次の通り。$ ./helloHello world!$
マージソート

マージソートのアルゴリズムについては、当該記事を参照されたい。ここではマージソートを3つの関数 split、merge、MergeSort で実装している。

関数 split は、追加の引数を持つ局所関数 split_iter を使って実装している。これは末尾再帰の実装に便利な手法である。この関数はSMLのパターンマッチング構文を使っており、リストが空でないケース (x::xs) と空のケース ([]) を定義している。 (* 要素のリストを与えられ、それをほぼ同じサイズの * 2つに分割する。 * O(n) *) local fun split_iter (x::xs, left, right) = split_iter(xs, right, x::left) 。 split_iter ([], left, right) = (left, right) in fun split(x) = split_iter(x,[],[]) end;

local-in-end という構文を let-in-end という構文に置き換えると、等価な定義が得られる。 fun split(x) = let fun split_iter (x::xs, left, right) = split_iter(xs, right, x::left) 。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:20 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef