12 1 3 2 組合序列表示式

2021-06-28 07:58:03 字數 1313 閱讀 9562

12.1.3.2 組合序列表示式

在 c# 中,yield return 關鍵字只能返回乙個元素,因此,如果我們要在 c# 中,使用迭代器實現的方法中,產生整個序列,那麼,就必須使用 foreach 迴圈,遍歷序列中所有元素,逐個產生元素。這也能執行,但效率低下,特別是,如果用這種方式處理幾個巢狀的序列。在函式式程式設計中,可組合性(composability)是乙個更重要的概念,所以,f# 能夠組合序列,使用專門的語言表達結構:yield!(通常發音 yield-bang),從序列表示式生成整個序列。清單 12.3 演示了以三種不同的方法生成城市序列。

清單 12.3 從不同的資料來源組合序列 (f# interactive)

> let capitals = [ "paris";"prague" ];;  <-- 首都列表

val capitals : string list

> let withnew(name) =  <-- 返回名字和名字加字首

seq ;;

val withnew : string ->seq

> let allcities =

seq ;; [3]

val allcities : seq

> allcities |> list.ofseq;;

val it : string list = ["oslo";"paris"; "prague"; "york"; "new york"]  <-- 把所有資料組合在一起

清單 12.3 首先建立兩種不同的資料來源。第乙個是 f# 列表,有兩個首都,值的型別是 list;因為 f# 列表實現了 seq <'a> 介面,因此,在後面的**中能夠將它當作序列來使用。第二個資料來源是函式,生成有兩個元素的序列。接下來的**段演示了將如何這兩個資料來源聯接成乙個序列。首先,使用 yield 語句返回乙個值[1];接著,使用 yield! 結構返回 f# 列表中的所有元素[2];最後,呼叫 withnew 函式[3](返回乙個序列),返回序列中的所有元素。從這裡可以看出,可以在乙個序列表示式中,混合使用兩種產生元素的方法。

就像 yield 一樣,yield! 結構也是延遲返回元素。就是說,當**到達呼叫 withnew 函式時,這個函式才真正呼叫,而且,只返回表示該序列的物件。如果我們在函式中寫的**,放在 seq 塊之前,它會在這一點上執行,但是,seq 塊的主體並不會執行。它要到 withnew 函式返回之後才發生,因為我們需要生成下乙個元素。當執行到達第乙個 yield 結構時,它會返回元素,並將控制權返回到呼叫者。呼叫者然後執行其他操作,當呼叫者請求另乙個元素時,序列的執行才恢復。

我們一直專注於序列表示式的語法,但是,只有開始使用,才不會覺得棘手。使用序列表示式時,有幾個常用的模式,我們看其中的兩個。

組合表示式

請考慮乙個被空格分隔的,由1到n的整數組成的遞增數列 1 2 3 n。現在請在數列中插入表示加的 或者表示減 亦或者表示空白的 例如1 2 3就等於1 23 來將每一對數字組合成乙個表示式 第乙個數字前無空格 計算該表示式的結果並判斷其值是否為0。請你寫乙個程式找出所有產生和為零的長度為n的數列。輸...

常用正規表示式 合

regexr 菜鳥工具 不過後期用的多的,還是word的裡面的萬用字元。後續會新增word萬用字元的實用案例。重複0 多次 重複1 多次 重複0 1次 重複n次 重複n 多次 重複n到m次 匹配除換行符以外的任意字元 w 匹配字母或數字或下劃線或漢字 s 匹配任意的空白符space 包括空格,製表符...

計蒜客 組合表示式

請考慮乙個被空格分隔的,由1到n的整數組成的遞增數列 1 2 3 n。現在請在數列中插入表示加的 或者表示減 亦或者表示空白的 例如1 2 3就等於1 23 來將每一對數字組合成乙個表示式 第乙個數字前無空格 計算該表示式的結果並判斷其值是否為0。請你寫乙個程式找出所有產生和為零的長度為n的數列。輸...