Dot-Net
FSharp.Core 中“id”函式的目的是什麼?
身份功能。
參數:x 類型:‘T(輸入值)
返回值:相同的值
F# 核心庫版本,支持:2.0、4.0、攜帶式
為什麼有一個返回其輸入的函式?
當使用高階函式(即返回其他函式和/或將其他函式作為參數的函式)時,您總是必須提供一些東西作為參數,但並不總是需要應用實際的數據轉換.
例如,該函式
Seq.collect將一個序列序列展平,並採用一個函式,該函式為“外部”序列的每個元素返回“嵌套”序列。例如,您可以通過以下方式獲取某種 UI 控制項的所有孫子列表:let control = ... let allGrandChildren = control.Children |> Seq.collect (fun c -> c.Children)但是很多時候,序列的每個元素本身已經是一個序列 - 例如,您可能有一個列表列表:
let l = [ [1;2]; [3;4]; [5;6] ]在這種情況下,您傳遞給的參數函式
Seq.collect只需要返回參數:let flattened = [ [1;2]; [3;4]; [5;6] ] |> Seq.collect (fun x -> x)該表達式
fun x -> x是一個只返回其參數的函式,也稱為“恆等函式”。let flattened = [ [1;2]; [3;4]; [5;6] ] |> Seq.collect id在使用高階函式(例如
Seq.collect上面的函式)時,它的用法經常出現,因此它應該在標準庫中佔有一席之地。另一個引人注目的例子是
Seq.choose- 一個過濾一系列Option值並同時展開它們的函式。例如,您可以通過以下方式將所有字元串解析為數字並丟棄無法解析的字元串:let tryParse s = match System.Int32.TryParse s with | true, x -> Some x | _ -> None let strings = [ "1"; "2"; "foo"; "42" ] let numbers = strings |> Seq.choose tryParse // numbers = [1;2;42]但是,如果您已經獲得了一個
Option值列表,該怎麼辦?身份功能來拯救!let toNumbers optionNumbers = optionNumbers |> Seq.choose id