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
類型的構造函數。 ::
構造函數有兩個參數:列表的頭部和列表的尾部。 head
和tail
是與::
構造函數的這兩個參數匹配的可變模式。因此,如果列表非空,則此模式匹配,並分別將變量head
和tail
分配給非空列表的開頭和結尾。
http://caml.inria.fr/pub/docs/manual-ocaml/expr。html#模式匹配 –
是的,我看到了這一點,但沒有關於什麼模式匹配表達式MEAN的信息。只是沒有語義的語法描述。 –
http://caml.inria.fr/pub/docs/manual-ocaml/expr.html#@manual.kwd46(它進一步放在同一頁面上)解釋了「匹配」表達式實際所做的事情(不僅僅是語法)和http://caml.inria.fr/pub/docs/manual-ocaml/patterns.html解釋了模式的含義。雖然這可能不是很容易消化。 – sepp2k