12 1 1 使用高階函式

2021-06-01 11:46:40 字數 939 閱讀 2354

12.1.1 使用高階函式

在 f# 中,用於處理序列的函式在 seq 模組中,我們將解釋乙個非常普通的函式,seq.unfold。你可以看到,它與 fole 函式相對,它取乙個集合,並把它"折"成單一值。unfold 取單一值,把它"展開"為乙個序列。下面的**片斷展示了如何生成乙個序列,包含把 10 個數字格式化為字串:

> let nums = seq.unfold (fun num –>

if (num <= 10) then some(string(num), num + 1) else none) 0

;; val nums : seq= seq ["0"; "1"; "2"; "3"; ...]

num 值表示序列在生成過程中使用的狀態。當第一次呼叫 lambda 函式時,num 的值設定為第二個引數的初始值 (在本例中為零)。lambda 函式返回包含乙個元組選項型別的值。none 值標誌序列的末尾。當我們返回 some 時,我們給它兩個不同值在元組中:

■ 乙個值,在序列中返回(這裡,轉換為字串的數字)。

■ 另乙個值,是新的狀態,用於 lambda 函式下一次呼叫時。

如你所見,在輸出中,返回值的型別是 seq。這是乙個 f# 型別,是 ienumerable型別的別名。這是一種寫相同型別的不同方式,同樣,fold 是 system.single 的 c# 別名,所以,可以自由地混合使用。輸出還顯示了序列的前面幾個元素,因為這個序列可以是無窮的,f# interactive shell 不會嘗試輸出所有的值。

標準的 .net 庫沒有為 c# 包含乙個類似的方法。在 c# 中,生成序列的方法是 enumerable.range(來自 system.linq 命名空間),它返回的指定長度的數字公升序序列(第二個引數), 從指定的起始數 (第乙個引數)。我們可以在 c# 中實現類似 seq.unfold 的函式,但我們將會看到,類似結果可以很容易地通過使用 c# 迭代,我們來看看下一步。

12 1 1 使用高階函式

12.1.1 使用高階函式 在f 中,處理序列的函式在seq 模組中,我們將解釋乙個非常普通的函式,seq.unfold。可以看到,與fole 函式是一對,它的引數為集合,把集合 摺疊 成乙個值 unfold 的引數乙個值,把這個值 展開 為序列。下面的 片斷生成的序列,包含格式化為字串的 0 到1...

1211物件導向 封裝 建構函式

三 類的屬性 封裝字段 包含兩個方法 1 讀訪問器 get 取值 2 寫訪問器 set 賦值 封裝 private string nihao 原有的普通變數private私有的,通過右鍵 重構 封裝字段實現 預設一直存在get和set兩個方法,但是一直隱藏資訊的特性 set 封裝字段 public ...

常見高階函式使用

python中如果將乙個函式名傳送給另乙個函式作為形參,那麼就成這個函式為高階函式 簡單例子 f abs 這就表示python中函式名是可以傳送給變數的 print f 9 def add a,b,f return f a f b print add 1,2,abs 如果將函式名傳入為另乙個函式引數...