標準 ML 程式設計
外觀
由於本書遠未完成,因此現有頁面列於此處。
標準 ML (SML) 屬於 ML 程式語言家族。與該家族的其他成員(如 OCaml)一樣,它的特點是強型別靜態型別推斷、嚴格求值和模組系統,該系統具有簽名、結構和函子。當前標準來自 1997 年;它取代了 1990 年的早期標準,之後的標準被稱為繼任者 ML (sML)。
以下程式碼段定義了一個函式 factorial,該函式計算非負整數 n 的階乘。
local
val rec fac = fn 0 => 1 | n => n * fac (n - 1)
in
fun factorial n = if n < 0 then raise Domain else fac n
end;
一個重要的說明:在 SML/NJ 的互動式頂層,終端分號對於評估到目前為止的程式碼是必需的,但分號通常是可選的作為語句終止符;它僅在分離順序表示式時是必需的。
以下程式碼段定義了一個函式 gray_code,該函式將整數 n 對映到一個包含所有不同的n 字串的列表,其中包含 0 和 1,按格雷碼順序排列,使得每個元素與其相鄰元素在恰好一個字元上不同,然後計算一個三數字格雷碼的字串,該字串等於 "000-001-011-010-110-111-101-100"。
fun prefix p s = String.concat [p, s];
fun extend p xs = List.map (prefix p) xs;
fun expand prev = extend "0" prev @ List.rev (extend "1" prev);
fun gray_code n = if n < 1 then [""] else expand (gray_code (n - 1));
fun print_line a = print a before print "\n";
print_line (String.concatWith "-" (gray_code 3));
開始使用標準 ML 的先決條件是編譯器,大多數編譯器直接生成機器程式碼;然而,像大多數動態語言一樣,幾個 SML 編譯器提供了一個互動式頂層,它根據需要編譯和評估程式碼,這對於新生和低年級學生來說可能很方便。
- 關於標準 ML
- 編譯器和直譯器