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

概要

編集

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-式の値は、 inend に挟まれた式の値になる。

モジュールシステム

編集

Standard ML  structure SML使

3SMLsignature  structure  functor structure structure (substructure) 1signature  structure  structure substructure  signature  (abstract type)functor  structure  structure functor 1signature  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 queue
end

この 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 queue2structure  signature 

structure 使 string TwoListQueue.queue TwoListQueue.emptyq  TwoListQueue.remove q 

コード例

編集

SMLSML/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

実行は次の通り。

$ ./hello
Hello world!
$

マージソート

編集

3 splitmergeMergeSort 

 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)
   |   split_iter ([], left, right) = (left, right)
  in
   split_iter(x,[],[])
  end;

split と同様、merge も局所関数 merge_iter を使って効率化する。merge_iterではいくつかのケース(渡されたリストがどちらも空でない場合、一方が空の場合、両方が空の場合)を定義している。 _ はワイルドカード・パターンを表している。

この関数は2つの昇順のリストを1つの降順のリストにマージする。逆転するのはSMLにおけるリストの構造によるものである。SMLではリストを非平衡2分木で実装しているため、要素を先頭に付与するのは容易だが、最後尾に付与するのは非効率的である。

 (* 2つの昇順リストを1つの降順リストにマージする。
  * 関数 lt(a,b) は a < b と同値
  * O(n)
  *)
 local
  fun merge_iter (out, left as (x::xs), right as (y::ys), lt) =
      if lt(x, y)
       then merge_iter(x::out, xs, right, lt)
       else merge_iter(y::out, left, ys, lt)
  |   merge_iter (out, x::xs, [], lt) = merge_iter( x::out, xs, [], lt)
  |   merge_iter (out, [], y::ys, lt) = merge_iter( y::out, [], ys, lt)
  |   merge_iter (out, [], [], _) = out
 in
  fun merge(x,y,lt) = merge_iter([],x,y,lt)
 end;

最後に、MergeSort関数を以下に示す。

 (* リストを降順にソートする。順序は lt(a,b) <==> a < b で決定。
  * O(n log n)
  *)
 fun MergeSort(empty as [], _) = empty
 |   MergeSort(single as _::[], _) = single
 |   MergeSort(x, lt) =
     let
      val (left, right) = split(x)
      val sl = MergeSort(left, lt)
      val sr = MergeSort(right, lt)
      val s = merge(sl,sr,lt)
     in
      rev s
     end;

ltlt

任意精度の階乗関数(ライブラリ)

編集

SMLでは、IntInf モジュールで任意精度(多倍長精度)の整数の算術を提供している。さらに言えば、コード内に現れる整数はどれだけ桁数があってもプログラマが気にする必要がない。

次のプログラム fact.sml は、任意精度の階乗関数を実装したもので、120の階乗を表示する。

   fun fact n : IntInf.int =
       if n=0 then 1 else n * fact(n - 1)
   
   val () =
       print (IntInf.toString (fact 120)^"\n")

コンパイルして実行すると次のようになる。

   $ mlton fact.sml
   $ ./fact
   66895029134491270575881180540903725867527463331380298102956713523016335
   57244962989366874165271984981308157637893214090552534408589408121859898
   481114389650005964960521256960000000000000000000000000000

数値微分(高階関数)

編集

SML1SML d f x
   - fun d delta f x =
       (f (x + delta) - f (x - delta)) / (2.0 * delta);
   val d = fn : real -> (real -> real) -> real -> real

 delta  delta 使

 d (real -> real) -> real -> real real  delta 
   - val d = d 1E~8;
   val d = fn : (real -> real) -> real -> real

 d real -> real使 x^3-x-1  x=3 
  - d (fn x => x * x * x - x - 1.0) 3.0;
  val it = 25.9999996644 : real

 f(x) = 3x21  f(3) = 271 = 26 

 d f (higher-order function) 

 a ->b a  ca * c ->b 便(a * c -> b) -> (a -> b) 使 Adapter 

離散ウェーブレット変換(パターンマッチング)

編集

21SML2 h1  h2s d 
   - fun haar l =
       let fun aux [s] [] d = s :: d
             | aux [] s d = aux s [] d
             | aux (h1::h2::t) s d =
               aux t (h1 + h2 :: s) (h1 - h2 :: d)
             | aux _ _ _ = raise Empty
       in  aux l [] []
       end;
   val haar = fn : int list -> int list


  - haar [1, 2, 3, 4, ~4, ~3, ~2, ~1];
  val it = [0,20,4,4,~1,~1,~1,~1] : int list

SML

実装

編集



MLton[1] - 

Standard ML of New Jersey[2] (SML/NJ) - 

Moscow ML[3] - Caml Light 

Poly/ML[4]

TILT[5] - 使

HaMLet[6] - 

ML Kit[7] - 

SML.NET[8] - CLR.NET

SML2c[9] - C

Poplog[10] - POP-11Standard MLCommon LispProlog 使

SML#[11] - C.NET

MLWorks[12] -  Harlequin Ravenbrook 

SMLSML

参考文献

編集
  • 大堀 淳『プログラミング言語Standard ML入門 改訂版』共立出版、東京、2021年11月12日。ISBN 9-78432012480-6 

脚注

編集
  1. ^ Milner, R.; M. Tofte, R. Harper and D. MacQueen. (1997年) (PDF). The Definition of Standard ML (Revised). MIT Press. ISBN 0-262-63181-4. https://smlfamily.github.io/sml97-defn.pdf 

外部リンク

編集