2013-01-21 42 views
1

我希望看到下面引用的書中的一個例子。我知道這是關於模式匹配的東西,但我在哪裏可以找到關於表達意味着什麼的完整和準確的描述?哪裏可以找到OCaml索引參考?

# let rec sort lst = 
# match lst with 
# [] -> [] 
# | head :: tail -> insert head (sort tail) 
# and insert elt lst = 
# match lst with 
# [] -> [elt] 
# | head :: tail -> if elt <= head then elt :: lst else head :: insert elt tail 
# ;; 
+0

http://caml.inria.fr/pub/docs/manual-ocaml/expr。html#模式匹配 –

+0

是的,我看到了這一點,但沒有關於什麼模式匹配表達式MEAN的信息。只是沒有語義的語法描述。 –

+1

http://caml.inria.fr/pub/docs/manual-ocaml/expr.html#@manual.kwd46(它進一步放在同一頁面上)解釋了「匹配」表達式實際所做的事情(不僅僅是語法)和http://caml.inria.fr/pub/docs/manual-ocaml/patterns.html解釋了模式的含義。雖然這可能不是很容易消化。 – sepp2k

回答

3

This page in the OCaml manual解釋match是如何工作的:

表達

match expr 
with pattern1 -> expr1 
| … 
| patternn -> exprn 

對圖案式樣1至patternn expr的值相匹配。 如果與patterni的匹配成功,則會計算關聯的表達式 expri,並且其值將成爲整個匹配 表達式的值。 expri的評估發生在一個環境 豐富的匹配過程中執行的綁定。如果多個 模式與expr的值相匹配,則會選擇 匹配表達式中首先出現的模式。如果沒有任何模式匹配expr的值 ,則引發異常Match_failure。

也就是說,它會嘗試一種模式,直到找到匹配的模式。一旦完成,它將返回與該模式相關的表達式(即->右側的表達式)。如果沒有模式匹配,你會得到一個異常。

有哪些種類的圖案以及它們的含義在this page of the manual上進行了解釋。這是一個有點吃不消了,所以這裏的相關位的摘要:

最重要的模式是可變的模式和變量模式:

變量模式是一個簡單的變量名。該模式始終匹配,並允許您通過->右側的給定名稱查找匹配的表達式。除了名稱外,您還可以使用_,該名稱也始終匹配,但不允許您參考->右側的值。

變體模式是變體類型的構造函數的名稱,後跟隨構造函數接受參數的模式。如果匹配的值使用特定的構造函數,並且該值內的每個元素都與相應的模式匹配,則此模式匹配。

在你的例子中,第一個模式是[]。這是代表空列表的list類型的構造函數。 []構造函數不帶任何參數。因此,如果列表爲空,則此模式匹配。第二種方式是head :: tail::是表示非空列表的list類型的構造函數。 ::構造函數有兩個參數:列表的頭部和列表的尾部。 headtail是與::構造函數的這兩個參數匹配的可變模式。因此,如果列表非空,則此模式匹配,並分別將變量headtail分配給非空列表的開頭和結尾。

相關問題