ticoAg/ChineseCorpus-Kaggle-fanti huggingface dataset:
area (Triangle (a, b, c)) = heron (a, b, c)
次序在模式匹配中是緊要的：模式按文本次序來依次進行匹配。在特定計算中，使用下劃線_，來省略不需要它的值的子成員，這也叫做通配符（wildcard）模式。所謂的“子句形式”風格的函數定義，這里的模式緊隨在函數名字之后出現，只是如下形式的一種語法糖：
fun area shape = case shape
of Circle (_, r) => 3.14 * r * r
Square (_, s) => s * s
Triangle (a, b, c) => heron (a, b, c)
模式窮盡性檢查將確保數據類型的每個情況都已經顧及到。
如果有遺漏，則產生警告。
如果模式存在冗余，也會導致一個編譯時間警告。
函數可以接受函數作為實際參數，比如：
fun applyToBoth f x y = (f x, f y)
函數可以產生函數作為返回值，比如：
fun constantFn k = (fn anything => k)
函數可以同時接受和產生函數，比如：
fun compose (f, g) = (fn x => f (g x))
基本庫的函數List.map，是在Standard ML中最常用的Curry化高階函數，它在概念上可定義為：
fun map' _  =
map' f (x :: xs) = f x :: map f xs
在基本庫中將函數復合定義為多態中綴算符(f o g)，map和fold高階函數有較高效率的實現。
異常可以使用raise關鍵字發起，并通過模式匹配handle構造來處理：
exception Undefined;
fun max x = x
max (x :: xs) = let
val m = max xs
if x > m then x else m
max  =
raise Undefined
fun main xs = let
val msg = (Int.toString (max xs))
handle Undefined => "empty list...there is no max!"
print (msg ^ "\n")
這里的^是字符串串接算符。可以利用異常系統來實現非局部退出，例如這個函數所采用技術：
exception Zero;
fun listProd ns = let
fun p  = 1
p (0 :: _) = raise Zero
p (h :: t) = h * p t
(p ns)
handle Zero => 0
異常Zero在0情況下發起，控制從函數p中一起出離。
初始化基礎庫還以引用的形式提供了可變的存儲。引用ref可以在某種意義上被認為是如下這樣定義的：
datatype 'a ref = ref of 'a
還定義了內建的:=函數來修改引用的內容，和!函數來檢索引用的內容。階乘函數可以使用引用定義為指令式風格：
fun factImperative n = let
val i = ref n and acc = ref 1
while !i > 0 do
(acc := !acc * !i;
i := !i - 1);
這里使用圓括號對以;分隔的表達式進行了順序復合。
可變類型'a ref是等式類型，即使它的成員類型不是。兩個引用被稱為是相等的，如果它們標識相同的“ref單元”，就是說相同的對ref構造子調用生成的同一個指針。因此(ref 1) = (ref 1)和(ref 1.0) = (ref 1.0)都是有效的，并且都求值為false，因為即使兩個引用碰巧指向了相同的值，引用自身是分立的，每個都可以獨立于其他而改變。
模塊是ML用于構造大型項目和庫的系統。
一個模塊構成自一個簽名（signature）文件和一個或多個結構文件。簽名文件指定要實現的API（就像C語言頭文件或Java接口文件）。結構實現這個簽名（就像C語言源文件或Java類文件）。解釋器通過use命令導入它們。ML的標準庫被實現為這種方式的模塊。
例如，下列定義一個算術簽名：
signature ARITH =
eqtype t
val zero : t
val one : t
val fromInt: int -> t
val fromIntPair : int * int -> t
val fromReal : real -> t
val succ : t -> t
val pred : t -> t
val ~ : t -> t
val + : t * t -> t
val - : t * t -> t
val * : t * t -> t
val / : t * t -> t
val == : t * t -> bool
val  : t * t -> bool
val > : t * t -> bool
val >= : t * t -> bool
val  bool
和這個簽名使用有理數的實現：
structure Rational : ARITH =
datatype t = Rat of int * int
val zero = Rat (0, 1)
val one = Rat (1, 1)
fun fromInt n = Rat (n, 1)
fun ineg (a, b) = (~a, b)
fun fromIntPair (num, den) = let
fun reduced_fraction (numerator, denominator) = let
fun gcd (n, 0) = n
gcd (n, d) = gcd (d, n mod d)
val d = gcd (numerator, denominator)
if d > 1 then (numerator div d, denominator div d)
else (numerator, denominator)
if num  0 andalso ((h_1 > (maxInt - h_2) div i)
orelse (k_1 > (maxInt - k_2) div i))
then (h_1, k_1)
else if f  c) else (a * d) > (b * c)
fun lt (Rat (a, b), Rat (c, d)) =
if b = d then (a  b = not (eq (a, b))
fun a > b = gt (a, b)
fun a >= b = (gt (a, b) orelse eq (a, b))
下面是這個結構的簡單用例：
infix ==
local open Rational
val c = let
val a = fromIntPair(2, 3)
val b = fromIntPair(4, 6)
structure R = Rational
R.fromReal(3.245)
Standard ML只允許通過簽名函數同實現進行交互，例如不可以直接通過這個代碼中的Rat來建立數據對象。結構塊對外部隱藏所有實現細節。這里的:叫做透明歸屬（ascription），可以通過所綁定的變量見到此結構的數據內容，與之相對的是:>，它叫做不透明歸屬，此結構的數據內容對外完全不可見。比如上面用例有結果：val c = Rat (4,3) : Rational.t，如果改為不透明歸屬則有結果：val c = - : Rational.t。
要用有理數進行實際上的數值計算，需要處理分數形式中分母快速增大導致溢出整數類型大小范圍等問題。
函子接受指定簽名的一個結構作為參數，并返回一個結構作為結果，下面示例的函子能在ARITH簽名的結構上計算移動平均：
signature MOVINGLIST =
type t
structure Arith : sig
type t end
val size : t -> int
val average : t -> Arith.t
val fromList : Arith.t list -> t
val move : t * Arith.t -> t
val expand : t * Arith.t -> t
val shrink : t -> t
val trunc : t -> t
functor MovingList (S: ARITH) : MOVINGLIST =
type t = S.t list * int * S.t
structure Arith = S
fun size (ml : t) = #2 ml
fun average (ml : t) = #3 ml
fun fromList (l : S.t list) = let
val n = length l
val sum = foldl S.+ S.zero l
local open S in
val m = sum / (fromInt n) end
if (null l) then raise Empty
else (l, n, m)
fun move ((l, n, m) : t, new : S.t) = let
val old = List.nth (l, n - 1)
val m' = m + (new - old) / (fromInt n) end
(new :: l, n, m')
fun expand ((l, n, m) : t, new : S.t) = let
val n' = n + 1;
val m' = m + (new - m) / (fromInt n') end
(new :: l, n', m')
fun shrink ((l, n, m) : t) = let
val n' = if (n > 2) then n - 1 else 1
val m' = m + (m - old) / (fromInt n') end
(l, n', m')
fun trunc ((l, n, m) : t) =
(List.take (l, n), n, m)
和這個函子的簡單用例：
structure MLR = MovingList (Rational)
val d = MLR.fromList R.fromIntPair (4, 5), R.fromIntPair (2, 3)
val d = MLR.expand (d, R.fromIntPair (5, 6))
val d = MLR.move (d, R.fromIntPair (7, 8))
val d = MLR.shrink d
val d = MLR.trunc d
這個用例承上節示例，Rational結構采用了透明歸屬，有結果如：val d = (Rat (4,5),Rat (2,3),2,Rat (11,15)) : MLR.t。如果它改為不透明歸屬，則對應結果為：val d = (-,-,2,-) : MLR.t。
下列例子使用了Standard ML的語法和語義。
下面是求素數的試除法實現：
fun prime n = let
fun isPrime (l, i) = let
fun existsDivisor  = false
existsDivisor (x :: xs) =
if (i mod x) = 0 then true
else if (x * x) > i then false
else existsDivisor xs
not (existsDivisor l)
fun iterate (acc, i) =
if i > n then acc
else if isPrime (acc, i)
then iterate (acc @ i, i + 2)
else iterate (acc, i + 2)
基本庫find和exists函數在不存在符合條件元素的時候會遍歷整個列表，
這里采用了特殊化了的existsDivisor，用以在后續元素都不滿足條件時立即結束運算。
下面是埃拉托斯特尼篩法實現：
fun dropComposite (acc, , _, _) = rev acc
dropComposite (acc, l as x :: xs, j, i) =
if j > n then List.revAppend (acc, l)
else if x  j
then dropComposite (acc, l, j + i, i)
else dropComposite (acc, xs, j + i, i)
fun init i = let
fun loop (l, i) =
if i  n
then 2 :: List.revAppend (acc, l)
else iterate (x :: acc,
dropComposite (, xs, x * x, x * 2))
這里基于列表的篩法實現符合埃拉托斯特尼的原初算法。篩法還有基于數組的直觀實現。
下面是其解釋器下命令行運行實例：
- fun printIntList (l: int list) =
=     print ((String.concatWith " " (map Int.toString l)) ^ "\n");
val printIntList = fn : int list -> unit
- val _ = printIntList (prime 100);
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
正規數是形如的整數，對于非負整數、和，它是可以整除的數。計算升序的正規數的算法經由戴克斯特拉得以流行
，理查德·漢明最初提出了這個問題，故而這個問題被稱為“漢明問題”，這個數列也因而被稱為漢明數。Dijkstra計算這些數的想法如下：
* 要加入序列中的數有下述形式：2h, 3h, 5h，這里的h是序列已有的任意的漢明數。
* 因此，可以生成最初只有一個1的序列H，并接著序列2H, 3H, 5H，并以此類推。
示例漢明數程序代碼，一般用來展示，確使計算只在需要時進行的純函數式編程方式。
fun Hamming_number n = let
fun merge (p, q) = let
fun revMerge (acc, p, q) =
if not (null p) andalso not (null q) then
if hd p  hd q
then revMerge ((hd q) :: acc, p, tl q)
else revMerge ((hd p) :: acc, tl p, tl q)
else if null p
then List.revAppend (q, acc)
else List.revAppend (p, acc)
if (null p) then q
else if (null q) then p
else rev (revMerge (, p, q))
fun mul m x =
if x  mapp (xs, a :: acc)
NONE => rev acc)
mapp (l, )
fun mergeWith f (m, i) = merge (f m, i)
fun generate l = let
fun listMul m = mapPrefix (mul m) l
foldl (mergeWith listMul)  2, 3, 5
fun iterate (acc, l) =
if (hd l) > (n div 2) then merge (l, acc)
else iterate (merge (l, acc), generate l)
if n > 0 then iterate (, 1) else
產生指定范圍內的漢明數需要多輪運算，后面每輪中的三個列表元素乘積運算中都可能產生超出這個范圍的結果，它們不需要出現在后續的運算之中。
基本庫mapPartial函數與它所映射的函數，通過基于Option結構的SOME和NONE構造子的協定，可以將所映射函數認為不符合條件的元素或者結果排除掉，它會遍歷整個列表。
由于這個算法采用升序列表，故而這里將它改寫為mapPrefix函數，用來在特定條件不滿足條件就立即結束。下面是漢明數程序在解釋器下命令行運行實例：
- val _ = printIntList (Hamming_number 400);
1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 40 45 48 50 54 60 64 72 75 80 81 90 96 100 108 120 125 128 135 144 150 160 162 180 192 200 216 225 240 243 250 256 270 288 300 320 324 360 375 384 400
下面是（CPS）的高階函數foldr和map的實現，和達成一個整數列表的合計函數的簡單用例：
fun foldr' f b l = let
fun f2 (k, ) = k b
f2 (k, a :: r) =
f2 (fn x => k (f (a, x)), r)
f2 (fn x => x, l)
fun map' f l =
foldr' (fn (x, y) => (f x) :: y)  l
fun sum l =
foldr' (fn (x, y) => (x + y)) 0 l
對于輸入e1, e2, ..., en，sum函數等價于函數復合(fn x => x) o (fn x => e1 + x) o (fn x => e2 + x) o ... o (fn x => en + x)，它應用于0上得到(e1 + (e2 + (... + (en + 0)...)))。
SML/NJ支持頭等對象的續體。頭等續體對一門語言而言是能完全控制指令執行次序的能力。它們可以用來跳轉到產生對當前函數調用的那個函數，或者跳轉到此前已經退出了的函數。頭等續體保存了程序執行狀態，它不保存程序數據，只保存執行上下文。
排序算法關注計算復雜度，特別是時間復雜度，基本庫函數的實現細節也要考慮在內，比如串接函數@，它被實現為fun l1 @ l2 = revAppend(rev l1, l2)，除非必需的情況避免使用遍歷整個列表的rev和length函數。
通過比較于這些排序算法的周知過程式編程語言比如C語言的實現，可以體察到ML在控制流程和列表數據結構上的相關限制，和與之相適應的采用尾遞歸的特色函數式編程風格。
下面是簡單的插入排序算法的尾遞歸和等價的普通遞歸實現：
fun insertSort l = let
fun insert pred (ins, l) = let
fun loop (acc, ) =
List.revAppend (acc, ins)
loop (acc, l as x :: xs) =
if pred (ins, x)
then List.revAppend (acc, ins :: l)
else loop (x :: acc, xs)
in  loop (, l) end
val rec ge = fn (x, y) => (x >= y)
rev (foldl (insert ge)  l)
fun insert pred (ins, ) =
insert pred (ins, l as x :: xs) =
then ins :: l
else x :: (insert pred (ins, xs))
x保存在形式參數acc對應的分配堆中
x保存在調用棧棧幀中
插入排序算法是穩定的，它在輸入列表趨于正序的時候性能最佳，在輸入列表趨于反序的時候性能最差，因此在算法實現中，需要insert函數所插入列表保持為反序，在插入都完成后經rev函數再反轉回正序。在預期輸入數據趨于隨機化或者預知它經過了反轉的情況下，可以采用保持要插入列表為正序的變體插入排序算法實現，它在輸入列表趨于反序的時候性能最佳，在輸入列表趨于正序的時候性能最差，它比自適應實現少作一次全列表反轉。
采用foldr函數可以相應的保持要插入列表為正序，由于fun foldr f b l = foldl f b (rev l)，它等同于對反轉過的列表應用變體插入排序。
希爾排序算法是對插入排序的改進，保持了，放棄了穩定性。
下面是希爾排序的實現：
fun shellSort l = let
loop (, l)
val rec lt = fn (x, y) => (x  (x :: l, n + 1)) (, 0) (rev l)
val incs = 1, 4, 9, 20, 46, 103, 233, 525, 1182, 2660,
5985, 13467, 30301, 68178, 153401, 345152,
776591, 1747331, 3931496, 8845866, 19903198,
44782196, 100759940, 226709866, 510097200
val gap = let
val v = len * 3 div 4
val thold = if (v = 0) then 1 else v
fun loop (acc, h) =
if (hd h) > thold then acc
else loop ((hd h) :: acc, tl h)
loop (, incs)
fun sort (h, lol) = map insertSort (group (lol, h))
hd (foldl sort lol gap)
這里采用的間隔序列是OEIS ，即，它是徳田尚之在1992年提出的。這個序列用遞推公式表示為：hk = ?h'k?，這里的h'k = 2.25·h'k-1 + 1而h'1 = 1。假定一個列表的長度s位于序列兩個元素之間，即hk-1 k ≤ s k+1，如果hk ≤ ·s，這里的n ≤ m，則選擇初始間隔為hk，否則為hk-1。在這個閾值下，對于不同長度s的列表和對應的初始間隔h，每個列表的這些初始子列表的平均長度，約在 ≤  范圍之內。間隔序列還可以采用OEIS ，它是Marcin Ciura在2001年通過實驗得到的。
下面是快速排序算法的自頂向下實現：
fun quickSort  =
quickSort x = x
quickSort x, y =
if x  (x
基本庫partition函數實現對快速排序而言有不必要的反轉，
這里采用了它的簡化改寫。在ML中快速排序應采用自底向上實現：
fun quickSort l = let
fun partition pred l = let
fun loop (, p, q) = (p, q)
loop (h :: t, p, q) =
if (pred h)
then loop (t, h :: p, q)
else loop (t, p, h :: q)
loop (l, , )
fun iterate (acc, ) = acc
iterate (acc,  :: xs) = iterate (acc, xs)
iterate (acc, x :: xs) = iterate (x :: acc, xs)
iterate (acc, x, y :: xs) = let
val (x, y) = if x  (x
下面是歸并排序算法的自底向上法實現：
fun mergeSort l = let
fun init (acc, ) = acc
init (acc, x) = x :: acc
init (acc, x, y) =
if x  (x > y))
val revMerge = mergeWith (fn (x, y) => (x
考慮輸入列表x1, ..., xi, a0, ..., a9, xj, ..., xn，這里在xi和xj之間的10個a，具有相同的值并且需要保持其下標表示的次序，這里的xi > a并且xj ，并且在這個區段前后的元素總數都能被3整除，則它被分解成子列表的列表Xm, ..., xj, a8, a9, a5, a6, a7, a2, a3, a4, a0, a1, xi, ..., X1，這里有m = n div 3；假定這4個含有a的子列表兩兩歸并，在歸并正序子列表的歸并條件x 下，能得到X1, ..., xi, a4, ..., a0, a9, ..., a5, xj, ..., Xk；繼續推演下去，在歸并反序子列表的歸并條件x > y下，能得到Xh, ..., xj, a0, ..., a9, xi, ..., X1。可以看出這種歸并操作能夠保證排序算法的穩定性，即具有相同值的元素之間的相對次序保持不變。
分解初始的子列表采用了插入排序，還可進一步增加其大小。歸并排序也有自頂向下實現。
下面是堆排序的基于數組的實現：
fun heapSort l = let
val h = Array.fromList l
val len = Array.length h
fun get i = Array.sub (h, i)
fun set i v = Array.update (h, i, v)
fun siftdown (i, ins, n) = let
fun sift k = let
val l = k * 2 + 1
val r = l + 1
if (r  (get l) then r
else if (l
在數組實現中，siftdown函數融合了插入和篩選功能，它首先在暫時位于堆頂的要插入的元素，和從堆頂節點左右子堆的兩個堆頂元素中篩選出的那個元素，二者中選擇出哪個適合作堆頂元素；如果要插入元素適合，則以它為新堆頂元素而結束整個過程，否則以篩選出元素為新堆頂元素，并自頂向下逐級處理提供了新堆頂元素的子堆，將要插入元素暫時作為其堆頂元素并對它繼續進行siftdown；siftdown只要到達了某個堆底，就插入要插入的元素而結束整個過程。
在提取堆頂元素生成結果列表時，先提取走堆頂元素的內容，再摘掉最后的堆底元素將它的內容暫時放置在堆頂，這時堆的大小也相應的減一，隨后的siftdown函數，篩選出新的堆頂元素，并把原最后堆底元素插入回堆中。
在heapify函數建造堆的時候，首先自列表中間將元素分為前后兩組，后組中的元素被視為只有一個元素的堆，然后從后往前處理前組中的元素，這時它的左右子節點已經是已有的堆或者為空，在其上進行siftdown，從而合成一個新堆。建造堆也可以采用siftup函數來實現，它自第二個元素開始從前往后逐個處理列表元素，其前面是已有的堆，將這個新元素自堆底向上插入到這個堆中。
堆排序算法也可以使用二叉樹數據結構來實現二叉堆：
datatype 'a heap
Leaf of 'a
Node of 'a * int * 'a heap * 'a heap
fun key Nil =
let val SOME a = Int.minInt in a end
key (Leaf k) = k
key (Node (k, _, _, _)) = k
fun count Nil = 0
count (Leaf _) = 1
count (Node (_, c, _, _)) = c
fun left Nil = Nil
left (Leaf _) = Nil
left (Node (_, _, l, _)) = l
fun insert (Nil, x) = Leaf x
insert (Leaf k, l) =
if l >= k
then Node (l, 2, Leaf k, Nil)
else Node (k, 2, Leaf l, Nil)
insert (Node (k, _, Leaf l, Nil), r) =
if r >= k
then Node (r, 3, Leaf k, Leaf l)
else if r >= l
then Node (k, 3, Leaf r, Leaf l)
else Node (k, 3, Leaf l, Leaf r)
insert (Node (k, c, l, r), x) = let
val (k, x) =
if k >= x then (k, x) else (x, k)
if (count l) = (key l)
then Node (k, c + 1, insert (r, x), l)
else Node (k, c + 1, l, insert (r, x))
fun extract Nil = Nil
extract (Leaf _) = Nil
extract (Node (_, _, l, Nil)) = l
extract (Node (_, c, l, r)) = let
val k = key l
val n = left l
if n = Nil
then Node (k, c - 1, r, Nil)
else if (key n) >= (key r)
then Node (k, c - 1, extract l, r)
else Node (k, c - 1, r, extract l)
fun heapify  = let
fun loop (acc, ) = acc
loop (acc, x :: xs) =
loop (insert (acc, x), xs)
loop (Nil, l)
fun generate h = let
fun loop (acc, Nil) = acc
loop (acc, h) =
loop ((key h) :: acc, extract h)
loop (, h)
generate (heapify )
二叉樹實現不能直接訪問堆底元素，從而不適宜通過摘掉它使堆的大小減一。這里的insert函數，在原堆頂元素和要插入元素中選擇適合者作為新的堆頂元素，將落選的另一個元素作為新的要插入元素，插入到利于保持這個堆平衡的那個子樹之中。這里的extract函數只篩選不插入，它將堆的大小減一。
這里的insert和extract函數也可以直接轉寫為等價的尾遞歸形式，與列表情況不同，只要樹結構能保持良好的平衡，采用尾遞歸形式就沒有太大的必要性。
在二叉樹實現下，也可以采用siftdown函數來初始建造堆，而不需要在節點中保存關于樹狀態的統計信息。
下面是針對非負整數的基數排序算法的實現：
fun radixSort l = let
fun distribute (l, d) = let
val t0 = (, , , , , , , )
fun loop (t, ) = let
fun join (acc, i) = let
val f = case i
of 1 => (#1 t) | 2 => (#2 t) | 3 => (#3 t)
6 => (#6 t)
if i  (x :: f0, f1, f2, f3, f4, f5, f6, f7)
1 => (f0, x :: f1, f2, f3, f4, f5, f6, f7)
2 => (f0, f1, x :: f2, f3, f4, f5, f6, f7)
3 => (f0, f1, f2, x :: f3, f4, f5, f6, f7)
4 => (f0, f1, f2, f3, x :: f4, f5, f6, f7)
5 => (f0, f1, f2, f3, f4, x :: f5, f6, f7)
6 => (f0, f1, f2, f3, f4, f5, x :: f6, f7)
7 => (f0, f1, f2, f3, f4, f5, f6, x :: f7)
_ => t0
loop (t, xs)
loop (t0, l)
val SOME maxInt = Int.maxInt
val max = foldl (fn (x, y) => if x > y then x else y) 0 l
fun iterate (l, d) = let
val l' = distribute (l, d)
if d >= (maxInt div 8 + 1) orelse
((max div d) div 8) = 0 then l'
else iterate (l', d * 8)
iterate (l, 1)
這里采用的基數是2的3次冪8，代碼所使用的列表元組大小與基數大小成正比，運算量與列表中元素的總數與最大數的位數的乘積成正比。
編寫排序算法進行測試除了使用簡單的數列，
測試用列表還可以使用線性同余偽隨機數函數來生成：
fun randList (n, seed) = let
val randx = ref seed
fun lcg  = (randx := (!randx * 421 + 1663) mod 7875; !randx)
(* fun lcg  = (randx := (!randx * 1366 + 150889) mod 714025; !randx) *)
定義和處理一個小型表達式語言是相對容易的：
exception Err;
datatype ty
= IntTy
BoolTy
datatype exp
Int of int
Not of exp
Add of exp * exp
If of exp * exp * exp
fun typeOf (True) = BoolTy
typeOf (False) = BoolTy
typeOf (Int _) = IntTy
typeOf (Not e) =
if typeOf e = BoolTy
then BoolTy
else raise Err
typeOf (Add (e1, e2)) =
if (typeOf e1 = IntTy) andalso (typeOf e2 = IntTy)
then IntTy
typeOf (If (e1, e2, e3)) =
if typeOf e1  BoolTy
then raise Err
else if typeOf e2  typeOf e3 then raise Err
else typeOf e2
fun eval (True) = True
eval (False) = False
eval (Int n) = Int n
eval (Not e) = (case eval e
of True => False
False => True
_ => raise Fail "type-checking is broken")
eval (Add (e1, e2)) = let
val (Int n1) = eval e1
val (Int n2) = eval e2
Int (n1 + n2)
eval (If (e1, e2, e3)) =
if eval e1 = True
then eval e2
else eval e3
fun exp_repr e = let
val msg = case e
of True  => "True"
False => "False"
Int n => Int.toString n
_ => ""
msg ^ "\n"
(* 忽略TypeOf的返回值，它在類型錯誤時發起Err *)
fun evalPrint e = (ignore (typeOf e); print (exp_repr (eval e)));
將這段代碼錄入文件比如expr-lang.sml，并在命令行下執行sml expr-lang.sml，可以用如下在正確類型的和不正確類型上運行的例子，測試這個新語言：
- val e1 = Add (Int 1, Int 2);  (* 正確的類型 *)
val e1 = Add (Int 1,Int 2) : exp
- val _ = evalPrint e1;
- val e2 = Add (Int 1, True);   (* 不正確的類型 *)
val e2 = Add (Int 1,True) : exp
- val _ = evalPrint e2;
uncaught exception Err
raised at: expr-lang.sml:25.20-25.23
* Standard ML和它的實現：
** SML/NJ，由普林斯頓大學和貝爾實驗室聯合開發的實現，它具有并發編程擴展Concurrent ML。
** MLton，嚴格遵循標準定義的強力的編譯器。
** HaMLet，由（MPI-SWS）的Andreas Rossberg編寫，是一個SML解釋器，意圖成為精確且合宜接近的標準定義參考實現。
* OCaml，由法國國家信息與自動化研究所（INRIA）維護，是一個“工業強度”的ML方言，演化自最初用來實現Coq定理證明器的Caml。
* ，由薩爾蘭大學設計的Alice ML，是基于Standard ML的函數式編程語言，擴展了對并發、分布式和約束式編程的豐富支持。
* ，由波士頓大學的Hongwei Xi和卡內基·梅隆大學的提出的發展而來，它向ML擴展了依賴類型。
* F#，由微軟研究院（MSR）開發，是一個基于OCaml的一個以.NET為目標的編程語言。
* F*，由MSR和INRIA主導開發，是一個基于ML的依賴類型函數式編程語言。
* Futhark，由哥本哈根大學（DIKU）開發，是屬于ML家族的一個函數式、數據并行、陣列編程語言。
* Ur，由麻省理工學院的Adam Chlipala開發，是語法基于Standard ML的專門用于web開發的一個函數式編程語言。
* CM-Lex和CM-Yacc，由卡內基·梅隆大學的Karl Crary開發，是用于Standard ML、OCaml和Haskell的詞法分析器和語法解析器。
* Amulet，是一個類ML的函數式編程語言，其編譯器輸出Lua文件。
* Alpaca，是一個受ML啟發的運行在Erlang上的函數式編程語言。
鄂善（，），滿洲鑲黃旗人，中國清朝官員，本籍滿洲鑲藍旗。清朝政治人物。
1738年由汀漳道調任福建分巡臺灣道。曾任吏部左侍郎。乾隆三年十二月己卯，接替訥親，擔任清朝兵部尚書，后革。由班第接任。
十三棍僧救唐王是中國的一個傳說故事，由于電影《少林寺》而使這個傳說變得廣為人知。
十三棍僧救唐王的傳說，最早見于民國初年梁啟超為《中華新武術棍術科》一書所作的序，文中說：
隋大業末，天下亂。流賊萬人，將近少林寺。寺僧將散走。有老頭陀短棍沖賊鋒，當之者皆辟易，不敢入寺。乃選少壯僧百人授棍法。唐太宗李世民征王世充，用僧眾以棍破之。敘其首功者十三人。
此后姜容樵在《少林棍法》中也持此說，韓慕俠為之作序，也持這一說法。
然而根據現存《秦王李世民告柏谷塢少林寺上座書》、《唐太宗賜少林寺教》、《皇唐嵩岳寺碑》等碑文，只有提到曇宗等13人擒王仁則的記載，并沒有少林僧人用棍和救李世民的記載。而史籍中更沒有唐宋時期少林僧人用棍習武的記載。
史蒂芬·皮爾·安德魯斯
史蒂芬·皮爾·安德魯斯（Stephen Pearl Andrews, ）是美國個人無政府主義者和作家。
1812年出生於馬薩諸塞州烏斯特郡（Worcester）的。他在18歲時前往路易斯安那州學習法律；他被當地的蓄奴現象給震撼，從此成為廢奴主義者。他在1839年前往德州，由於他激進的廢奴主義授課言論，他和他的家人差點遭到當地人的殺害，於是他們在1843年逃離了那裡。接著安德魯斯前往英國，試圖在那裡籌措資金以回國資助廢奴運動，但並沒有成功。
他對語音學和外國語言也相當感興趣，最後他學習了高達30種語言。到了1840年代他開始將注意力放在烏托邦的社區上，他和另外一名個人無政府主義者約書亞·沃倫（沃倫也是促使安德魯斯轉變為激進個人主義的人）一同在1851年於紐約州創立了Modern Times烏托邦社區，接著在1857年又在紐約市創建Unity Home。到了1860年代他已經構思出了一種名為「Pantarchy」（由所有人統治）的理想社會，並接著構思出了一套名為「宇宙學」（universology）的哲學，強調所有知識和行動的一貫性。
*''Cost the Limit of Price'' (1851年)
*''The Constitution of Government in the Sovereignty of the Individual'' (1851年)
*''The Science of Society'' (1851年)
*''The Sovereignty of the Individual'' (1853年)
*''Principles of Nature, Original Physiocracy, the New Order of Government'' (1857年)
*''The Pantarchy'' (1871年)
*''The Basic Outline of Universology'' (1872年)
*''The Labor Dollar'' (1881年)
*''Elements of Universology'' (1881年)
*''The New Civilization'' (1885年)
戮屍，泛指所有對屍體進行的懲罰性破壞。
戮屍於古代中國曾列入刑法。通常的做法是砍去死屍的頭。
一般而言，犯罪的人如在事件揭發之前已死，其罪行多不會被追究，俗語謂「已死勿論」 (見於《水滸傳》、《東周列國志》)。然而，如果罪行較為嚴重 (如謀反) ，即使在事件揭發時犯人已去世，當局亦可根據當時的法例，在犯人的屍體上施刑，是為戮屍。另外，對於被判死刑但在行刑前已身故的犯人，亦可根據其罪行嚴重程度決定是否戮屍。
《清史稿》卷一百一十八〈刑法志〉中，指戮屍為''「所以待惡逆及強盜應梟諸犯之監故者。」''，即所有應判梟首但在待刑時去世者均處戮屍之刑。
明朝自萬曆十六年 (1588年) 起，定有戮屍的條例，主要針對謀殺父母或祖父母者。清朝沿用有關刑法，並 (明文) 擴大至於強盜身上亦有效。
戮屍在1905年的刑法改革中被廢除。
中國歷代均有人由於在死後被定罪而被戮屍。
* 根據《史記》卷六〈秦始皇本紀〉，秦始皇之弟成嶠反叛失敗後死於屯留，其從屬軍吏''「皆斬死」''。另外''「卒屯留、蒲鶮反，戮其屍」''，已死的軍吏受戮屍之刑。
* 《遼史》卷一百二〈奸臣傳上〉所記載的其中三人 (耶律乙辛、張孝杰、蕭十三) 死後均因生前罪行揭發而被戮屍。
* 明朝太監魏忠賢死后，被下令將尸體凌遲梟首。
* 清朝文字獄期間亦有進行戮屍。呂留良即於雍正年間一次文字獄中與其長子呂葆中、弟子嚴鴻逵同遭戮屍。
在古代，信奉基督教國家的人曾認為：死後屍體要保持完整並朝東方埋葬，才能在最後的審判中起來面見神。
英國在亨利八世統治時期的一項法令曾指示只有謀殺犯的屍體可被用作解剖，而這被看作是對已被處死的犯人的附加懲罰。
* 教宗福慕 (896年去世) 的屍體被後來的教宗司提反七世掘了出來並進行審判（僵尸審判）。屍體的三隻手指在定罪後被斬去，而屍體最終被扔到臺伯河中。
* 約翰·威克里夫在死後被定為異端，屍體被掘出和燒毀。
* 弗拉德三世死後被奧斯曼軍隊斬首示眾。
* 克倫威爾死後，繼任的英王查理二世把其屍體掘出並進行車裂。
雙節棍，又稱雙截棍。早期源於宋太祖發明了雙節棍，宋太祖發明的雙節棍是現代雙節棍的前身。雙節棍由兩支中間以短鐵鏈或繩索連在一起的鐵棍或木棍所組成。
傳說宋太祖趙匡胤發明大盤龍棍（又稱大掃子、長小棒）和小盤龍棍（小掃子）兩種，與現在雙節棍不同的地方是大掃子是一長一短，用以長截破盾，與現在雙節棍應用技法上均大異其趣。但從宋代起連枷即成為中原地區的制式武器，，但名稱隨地區與朝代不同各有演變，如宋代與西夏的鐵鍊夾棒，，元明的馬上鞭棍、鞭棍，一直沿續到清代的虎頭棒、哨子棍等，皆有演練之法。雙節棍的英文名稱為「Nunchaku」，由琉球語」直譯而來。「ヌンチャク」並不是指雙節棍，因「ヌンチャク」並不是只指木質的棍，全體尺寸和雙節棍也有分別。琉球語「ヌンチャク」（nunchyaku）據說來自于閩南語“兩節棍”的發音“nng-chat-kun”，指長小棒。
由於雙節棍的特殊構造，得以衍生出各種華麗動作，加上攜帶便利，因此現受到很多武術運動愛好者的練習，且常用於武術表演。
雙節棍真正名揚世界是始於武打明星李小龍，因為在電影中多次使用，許多文獻都提到他是向菲律賓著名武術家伊諾山度學習雙節棍，但李小龍的女兒李香凝則否認此一說法，她提出自己父親的雙節棍功夫是出於自學。
*雙節棍不屬於中華民國《槍砲彈藥刀械管制條例》規範的武器。
*在《香港法例》中，雙節棍被列入「重力操作鋼棒」類（警用伸縮警棍也屬此類）。
*在中華人民共和國《管制刀具認定標準》中，雙截棍不屬于被管制的武器。廉價的松木質地雙截棍并無攻擊性，可作為體育器材。
由棍體和棍鏈組成，通常一根叫龍棍，另一根叫陽棍，又或叫青棍和白棍。對于單節棍體來說，靠近棍鏈一端稱為內端，另一端為外端。
共分為正握、反握、疊握、垂棍、架棍、夾棍、背棍、藏棍、舉棍等。
* 反握：虎口朝向外端稱為反握
*  Massimo Calabrò Freestyle Nunchaku (ヌンチャク,雙節棍, shuāng jié gùn) 2012
*  Massimo Calabrò Nunchaku New Techniques (ヌンチャク,雙節棍, shuāng jié gùn) Italy 2012
*  Massimo Calabrò Freestyle Nunchaku 2012 Avenue Good Way BBoy Bruce Lee Influence
麥克斯威爾·柏金斯
麥克斯威爾?柏金斯（，）是美國出版史上一位傳奇人物和編輯。
他曾為佛蘭西斯·史考特·基·費茲傑羅（F. Scott Fitzgerald）、歐內斯特·海明威（Ernest Hemingway）、湯瑪斯·伍爾夫（Thomas Wolfe）、瑪喬麗·金楠·勞林斯（Marjorie Kinnan Rawlings）等著名作家編書。
柏金斯出生於紐約。1907年從哈佛大學畢業後，他的第一份工作是在紐約時報當記者；1910年，他進入斯克裡布納之子公司擔任廣告經理一職；自1914年起轉戰編輯部，從此展開他一生最重要的編輯事業。
1917年，柏金斯開始和一位有志創作的年輕人通信，為了能順利出版他的作品，柏金斯歷經一番奮戰，不顧出版社文學顧問布羅奈爾的反對，堅持買下這位年輕人處女作的版權。最後經過數次的改寫，終於在1920年－《塵世樂園》（''This Side of Paradise''）一書進了印刷廠。此書出版後深獲好評，被認為是反映時代的一部佳作，這個年僅24歲、原本默默無聞的年輕人－佛蘭西斯·史考特·基·費茲傑羅，自此一舉成名，也是當時斯克裡布納之子公司出版記錄上最年輕的作家。柏金斯與費茲傑羅，兩人聯手宣告年輕爵士時代的來臨；也從此展開柏金斯與多位重要作家的共事經驗。
1925年，費茲傑羅在巴黎認識一位剛出道的窮作家，該作家正在撰寫自己的第一本長篇小說，於是費茲傑羅將他推薦給柏金斯；他就是日後在文學領域佔有舉足輕重地位、並獲得諾貝爾文學獎的歐內斯特·海明威。1926年，柏金斯幫助海明威出版他的成名作《太陽照樣升起》（臺譯《妾似朝陽又照君》''The Sun Also Rises''），正式將這位小說家引入美國文壇。
另一位著名小說家湯瑪斯·伍爾夫，亦是藉由柏金斯的挖掘與琢磨，始在文壇大放光芒。他曾在作品的扉頁上寫著，要把書獻給「一位偉大的編輯和一位勇敢而誠實的人。當作者陷入極度的失望和懷疑中時，他不吝於給予堅定的支持，不讓作者在絕望中輕易放棄。」藉此肯定柏金斯的貢獻。伍爾夫並在自己《你再也無法回家》（''You can't Go Home Again''）一書中，藉一個虛擬的人物愛德華（Foxhall Edwards）生動地刻畫這位編輯，使他的傳奇形象躍然紙上。
在柏金斯長達25年的編輯生涯中，他引導無數才華洋溢的作家開創寫作顛峰；他不僅是一位專業的編輯，同時身兼作者的精神支柱、忠實摯友、資金贊助者及事業生涯的引導者等多重身份。柏金斯認為編輯工作要盡己所能地挖掘、栽培作者的才華，並用各種方式協助一部優秀作品的完成；儘管他在編輯著作上花費許多的心血，但柏金斯自始至終都堅持自己的信念－「書是屬於作者的」。
柏金斯與費茲傑羅的信件往來，被收集成《''Dear Scott, Dear Max: The Fitzgerald-Perkins Correspondence''》（John Kuehl /Jackson Bryer,1991）一書出版，另一本性質類似的作品《''The Only Thing That Counts''》（Matthew J. Bruccoli/Robert W. Trogdon），則是談論有關柏金斯和海明威之間的關係。A. Scott Berg在1978年出版了一本頗暢銷的柏金斯傳記《''Max Perkins: Editor of Genius''》，當中記錄了他的一生與經歷。在《編輯寫給作者的信：柏金斯信件集》（''Editor to Author: The Letters of Maxwell Perkins''）一書中，集結了''柏金''斯有關編輯工作的信件，充分流露他卓越的能力與品味、領導文化潮流的強烈風格，更加奠定這位編輯巨匠的地位；此書是對編輯行業或角色有興趣的人，都該一讀的佳作。
1947年6月17日，柏金斯逝世。他生前在康乃迪克州的新卡納的住處，目前已被列入國家歷史古蹟管理處。
* 《天才柏金斯》：2016年傳記電影，麥克斯威爾·柏金斯由柯林·佛斯飾演。
*   Thomas Wolfe Memorial - Maxwell Perkins
*   Family tree of William Maxwell Perkins
在數學學科模型論中，語言  的結構 (也叫做 '-結構'，并通常寫為哥特體大寫)是一個有序對，它的第一個成員是論域或全集  (對應于可能帶有定義在其上的關系和函數的集合，并通常寫為相應于結構名字的羅馬體大寫)，它的第二個成員是一個釋義 ，就是  的一個偏函數，它完全定義在  的非邏輯符號之上，使得  的常量符號對應于  上的元素，如果有的話； 的函數符號對應于  上的函數，如果有的話；而  的關系符號對應于  上的關系；如果有的話。
在模型論中使用的術語模型，本質上是"結構"的同義詞，但是意圖用在不同的上下文中。典型的，術語"模型"在頭腦中有一個特定理論的時候使用，并且只考慮為這個理論的模型，—就是說滿足在這個理論中所有句子的結構。在另一方面，"結構"意圖在缺乏對這種結構的行為的所知或規定的時候使用。
每個一階邏輯結構都有一個"滿足關系"。
此關系是使用歸納定義的。
冷兵器，是指純用物理性攻擊而不使用化學燃爆的武器，與火器相對；一般是不利用火藥、炸藥等熱能打擊系統、熱動力機械系統、殺傷手段，以固體機械殺傷敵人、保護自己的武器裝備；多用於近戰和白刃格鬥，但部份亦可作遠距離拋射。
冷兵器的構造一般較火器簡單，可通過人力和機械的力量來操作。在火器沒有大規模被使用之前，冷兵器一直是戰場上廣泛被使用的兵器，因此冷兵器多屬於傳統兵器，但也有例外，如電磁砲雖是極先進的武器卻沒使用化學燃爆技術，因此也屬於冷兵器的一種。冷兵器最初是由木、石、骨等原始材料制成。隨著科技的發展，銅、鐵等金屬逐漸成為冷兵器的主要原料。
按照用途分類如下：
進攻性兵器可以分為格斗兵器，護身兵器，遠射兵器。亦有長兵器、短兵器分類，但長兵器與短兵器在兵書中有兩種定義，以下用不會混淆之名稱來敘述：
也稱長桿武器，一般是在長柄上安裝有鋒利的刃，使之具有殺傷性。這一類兵器是冷兵器時代最基本的攻擊性兵器。
一般短柄，易于單手使用，主要用作護體防身。
也稱投射武器、拋射兵器（來自英語Missile weapon），用來遠距離的殺傷敵人。主要有：
冷兵器時代的防護性裝具主要用來保護身體，以避免被敵人殺傷。例如：鎧甲、盔胄、盾牌等。
又稱攻城武器、圍城武器、攻守器械是用作攻城或守城的一類兵器包括攀城的云梯、撞擊云梯的衝撞車、堵門的刀車、重火力的床弩、砲（拋石機）等。
常用于生產領域的傳統農具和工具。
凡僅依靠物理推進而無使用化學燃爆，現今正在研發或剛使用不久的新式武器，皆算在先進冷兵器的範圍，屬於質量投射器的同類。
:以氣壓作動力來源，過去汽船所使用，奧地利帝國於18世紀末曾裝備過基然都尼氣步槍，稱之為奧地利氣槍兵。現在原理主要應用於輕氣槍、魚雷發射管、冷發射艦載垂直發射系統和航空母艦的蒸氣彈射器。
:目前僅有實驗階段，其因耗能效益問題而暫認定實用性不佳。
:又可稱電磁砲，美國海軍已通過實驗階段，時速可達9010公里，超過音速七倍。計畫未來將其搭載於新款軍艦上，如朱姆沃爾特級驅逐艦，儘管這只是傳聞並非定案。
:又可稱百足砲，採用多岔路式噴射原理，由於有效設計的體積龐大，實際上不適合作為武器，目前主要的發展方向是作為太空載具的輔助推升器，以取代成本較高的輔助推升火箭（蜈蚣砲初期建造成本較高，但長時間下來每次發射的花費會較推升火箭的建造費低，且效果更好）。第二次世界大戰德國開發的V-3炮有運用類似的原理輔助加速砲彈，但由於V-3炮使用火藥引爆和火箭推進，因此屬於火器非冷兵器。
新城國語力頒獎禮由香港新城電臺主辦，始於2002年8月，終於2015年，頒獎禮通常會在新城知訊臺、無綫音樂臺、J2播放，是香港地區唯一一個專為國語歌曲而設的頒獎禮，多數在7月至8月舉行。
根據每星期的國語力流行榜頒發國語力歌曲，由於電臺方面配合迎接21世紀，故此在該年度起每年選出21首「國語力歌曲」，而2006年則有74個獎項，2007年便有69個獎項。
因每屆頒出的獎項之多，大眾輿論與媒體認為新城國語力頒獎禮有「分豬肉」的傾向，加上事前確定未能到場之歌手未能獲獎，其授獎標準和頒獎禮公信力與新城勁爆頒獎禮多年來皆備受外界質疑，多位歌手在出道數年後即宣布不再參與新城電臺頒獎禮。騰訊娛樂：「從2005年，獎項即激增至124個，在性質上就已經從對樂壇的嘉獎變成了娛樂嘉年華。不設上限、沒有門檻，所以深受不少歌手的喜愛，特別是二、三線以及新人歌手；因為沒有門檻，報了名就有獎拿」。更被觀眾取笑其為「新城勁爆笑頒獎禮」。
*2005-2008年名為「新城國語力全球至尊歌手大獎」
排名不分先後：
新城國語力全球最受歡迎至尊歌手大獎
新城國語力亞洲歌手大獎
排名不分先後：（2002-2004年度名為新城國語力歌王、歌后）
莊年，字夔鳴，號榕亭，江蘇省常州府武進縣（今屬常州市）人，清朝政治人物。
監生出身，受保舉歷署福建龍巖縣、漳平縣、將樂縣、長泰縣印務，期滿實授長泰縣知縣。雍正十三年（1735年），調補福清縣知縣。乾隆六年（1741年）十一月陞任臺灣府淡水廳海防同知。七年（1742年），擢建寧府知府。八年（1743年）七月，擢臺灣道，加按察使司副使銜。九年（1744年）七月經試用一年後留任。十年（1745年）協同巡臺御史六十七、范咸、臺灣府知府褚祿重修《臺灣府志》。後遷甘肅平慶道。誥授中憲大夫，誥贈通議大夫、廣東按察使。
著作有《澄臺集》一卷。
*正室：徐氏（崑山徐氏），廣東肇羅道徐涵之女。
有四子二女。
*長女，適福建鹽大使溫州張瑞齡。
*《毗陵莊氏族譜》（2006年重修），卷四，分支世系表，二分第八世起元公世系表，頁三八七。
*國家圖書館特藏組，《臺灣歷史人物小傳——明清暨日據時期》，（臺北：國家圖書館，2003年12月），427頁
*張炳楠監修、李汝和主修，《臺灣省通志》，臺灣省政府，1961年。
*李騰嶽等監修、王詩瑯纂修，《臺灣省通志稿—人物志》，臺北市，成文出版社，1981年。
*中國方志叢書（第八十六號）民國馬龢鳴修，杜翰生等纂，福建省《龍巖縣志》，據民國九年鉛印本影印。
書成，滿洲鑲黃旗人，清朝政治人物。監生出身。
乾隆十年，擔任延平府知府，乾隆十二年，改任泉州府知府。1747年（乾隆12年），奉旨擔任福建分巡臺灣道，為臺灣清治時期這階段的地方統治者。
金溶，字廣蘊，號一齋。直隸順天府大興縣（今北京市大興區）人。中國清朝官員，回族。
金溶少年師從秀水諸錦。雍正八年（1730年），金溶中三甲進士。授刑部江蘇司主事。歷官員外郎。乾隆元年（1736年），主貴州鄉試。乾隆四年（1739年），任山東道監察御史。乾隆八年（1743年）湖廣總督孫嘉淦因包庇巡撫許容奪職，命修順義城。金溶爲孫嘉淦門生，上疏為其辯護，被奪職。次年二月複職。不久，發往福建以道府用。
乾隆十年（1745年），金溶出任漳州府知府。乾隆十五年（1750年）任福建分巡臺灣道，任內曾兼攝臺灣府知府。乾隆十七年（1752年）回內地，攝汀州府知府，因母喪丁憂回籍。乾隆二十一年（1756年），前往陝西辦理軍需，補官驛鹽道，歷署按察使、潼商道、延綏道，又因父喪去職。乾隆二十九年（1764年），補浙江督糧道，署寧紹臺道。乾隆三十二年（1767年），因與巡撫陳學鵬不合，被其論為“迂緩不任事”，以原品休致。乾隆四十二年十二月（1778年）卒於家，享年七十三歲。《清史稿》有傳。
父金懷瑋，武進士，官至雲南援剿左協副將。懷瑋生八子，皆成才。
*《浙江督糧道金公溶家傳》，《碑傳集·卷八五》
拕穆齊圖，為中國清朝官員，本籍蒙古鑲藍旗，號衡山。他於1752年（乾隆17年）奉旨擔任福建分巡臺灣道，為臺灣清治時期這階段的地方統治者。
覺羅四明，字松山，號朗亭，中國清朝官員，滿洲正藍旗人。
繙繹舉人出身。授筆帖式，后升任內閣中書。乾隆十五年，擔任福建汀州府同知。乾隆十六年，擔任福建理事同知。乾隆十七年，擔任福建廈門海防同知；同年改福建福寧府知府。乾隆十九年，署福建泉州府知府。乾隆二十年（1755年）接替徐景熹任福州府知府。乾隆二十二年，擔任福建臺灣府知府。乾隆二十六年（1761年）任福建分巡臺灣道。乾隆三十三年，任甘肅平慶道。乾隆三十四年，擔任四川嘉定府知府。