跳轉到內容

標準 ML 程式設計

25% developed
來自華夏公益教科書,開放的書籍,開放的世界

由於本書遠未完成,因此現有頁面列於此處。

  1. 型別
  2. 表示式
  3. 示例和練習
  4. 解決方案

關於標準 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
編譯器和直譯器
  • MLton:一個沒有互動式頂層的全程式最佳化編譯器
  • 新澤西標準 ML:一個帶有互動式頂層和庫的編譯器
  • Alice ML:一個帶有 GUI 的跨平臺直譯器
華夏公益教科書