第 12 章 語言擴展

1 值的遞迴定義

(在 Objective Caml 1.00 中引入)

如第 ‍11.7.2節所述,let rec 綁定結構除了定義遞迴函式外,還支援某些類別的非函式值的遞迴定義,例如

let rec name1 = 1 :: name2 and name2 = 2 :: name1 in expr

這會將 name1 綁定到循環列表 1::2::1::2::…,並將 name2 綁定到循環列表 2::1::2::1::…。非正式地說,接受的定義類別包含那些已定義名稱僅出現在函式主體內或作為資料建構子的引數的定義。

更精確地說,考慮表達式

let rec name1 = expr1 andand namen = exprn in expr

如果 expr1exprn 中的每一個都對於 name1namen 是靜態可建構的、未直接連結到 name1namen 中的任何一個,且不是其引數具有抽象類型的陣列建構子,則將接受此表達式。

如果以下至少一個條件為真,則表示表達式 e 對於變數 name1namen靜態可建構的

在以下情況下,表示表達式 e 直接連結到變數 name