3.3.2.1 用模式匹配分解列表
在 3.2.4 節,我們討論有關元組的匹配模式時,看到兩種不同的使用方法。一種方法是直接在 let 繫結中寫出模式,即可以把表示式的結果分配給值,也可以在函式引數的宣告中;另一種方法是使用 match 關鍵字。兩者的重要區別在於,使用 match 可以指定多個模式,有多個分支。處理列表,我們需要使用第二種方法,因為在列表處理時,每次都要指定兩個不同的分支,(乙個用於空列表,另乙個用於使用 cons cell 建立的列表)。
下面的**演示了在列表上的模式匹配,輸出的訊息是第乙個元素的值,如果列表為空,則「empty list」:
match list with
| -> printfn "empty list"
| head::tail -> printfn "startingwith %d" head
可以看到,在第二行的模式匹配空列表,在第三行的模式,提取列表的頭(第乙個元素的值)和列表的尾(列表頭後面的部分)。這兩個模式的語法與前面建立列表的語法完全相同。空列表用 來匹配,cons cell 使用:: 模式分解。第二種情況更重要,因為它把值分配給兩個新的符號,head 和 tail,將包含通過分解第乙個 cons cell 獲得的乙個數字,和列表的其餘部分。空列表不含任何值,因此,第乙個模式不繫結值到任何符號,它只會通知我們原始列表是空的。
如果參考圖 3.1,就會發現,第乙個模式對應於橢圓nil,不包含任何值;第二個模式匹配矩形cons cell,包含兩個部分的內容。
和元組一樣,列表也是完整模式,就是說,對於任意給定的列表,總會選擇乙個分支,不可能失敗。現在,如果我們嘗試使用不完整模式,看看會發生什麼。
清單 3.13 列表上的不完整模式匹配 (f# interactive)
> let squarefirst list =
matchlist with
|head::_ -> head * head
warning fs0025: incomplete pattern matcheson this | [1]
expression. the value '' will not bematched. |
val sqarefirst : int list –> int <-- 取列表,返回整數
> squarefirst [4; 5; 6];; [2]
val it : int = 16
> squarefirst [3]
exception of type 'microsoft.fsharp.core. | 執行時,丟擲異常
matchfailureexception' was thrown. |
我們首先宣告乙個函式 squarefirst,只包含乙個模式匹配,匹配 cons cell,返回列表中的第乙個元素的平方。然而,當列表為空時,此模式不能處理這種情況。我們可以看到,f# 編譯器是很聰明的,當我們寫的模式匹配可能會失敗時,它能檢測到這種情況,甚至為我們提供了匹配失敗的樣本[1]。通常不應該忽略這種警告,除非你絕對有把握永遠不會發生這種情況。即使對於空列表,函式沒有任何合理的意義,最好還是處理這種情況(模式可以使用下劃線字,表示匹配任意值),可以丟擲附帶資訊的異常,也可什麼都不做。當然,如果函式的返回型別是除 unit 以外的其他任何型別,即使什麼也不做,也必須給出乙個適當的返回值。如果函式真的不應該呼叫空列表,那麼,最好的辦法是丟擲異常。
儘管有警告,f# interactive 還是能夠處理,因此,我們可以嘗試呼叫這個函式。首先,嘗試一種可以工作的情況[2],我們會看到,它的行為與預期相同。如果用空列表作為引數呼叫函式[3],因為match 構造不包含任何匹配的模式,所以將丟擲異常。這是通常的 .net 異常,在 f# 中可以使用 try 結構捕獲到。
你可能會想,我們能從函式式列表中得到什麼,因此,在下一節,我們會把注意力轉到 c#,並用它來詳細解釋列表;我們還會寫出第一段列表處理的**。
Python匹配分組
字元功能 匹配左右任意乙個表示式 ab 將括號中字元作為乙個分組 num 引用分組num匹配到的字串 p 分組起別名 p name 引用別名為name分組匹配到的字串 import re 匹配出163 126 qq郵箱 ret re.match w 163 com lisus2000 163.com...
python 最大匹配分詞
參考部落格參考部落格 given a dict li 北京大學 生前 來 應聘 大學生 前來 北京 dic print dic 視窗從前面開始滑動,每次取maxlength 匹配不上也是捨棄後面的 forward max matching given the longest word in dict...
遞迴實現前向匹配分詞
coding utf 8 功能 遞迴實現前向匹配分詞 說明 zhuanma這個包借鑑自jieba分詞源 用於 將任意格式編碼的字串轉換為unicode編碼,統一 字典和待分詞語句的編碼後,便於句子切分和分詞.author date 2016 04 16 import re from zhuanma ...