3 3 2 1 用模式匹配分解列表

2021-06-25 22:22:07 字數 1908 閱讀 4931

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 ...