Dot-Net

FSharp.Core 中“id”函式的目的是什麼?

  • June 14, 2017

Operators.id<‘T> 函式 (F#)

身份功能。

參數:x 類型:‘T(輸入值)

返回值:相同的值

F# 核心庫版本,支持:2.0、4.0、攜帶式

為什麼有一個返回其輸入的函式?

當使用高階函式(即返回其他函式和/或將其他函式作為參數的函式)時,您總是必須提供一些東西作為參數,但並不總是需要應用實際的數據轉換.

例如,該函式Seq.collect將一個序列序列展平,並採用一個函式,該函式為“外部”序列的每個元素返回“嵌套”序列。例如,您可以通過以下方式獲取某種 UI 控制項的所有孫子列表:

let control = ...
let allGrandChildren = control.Children |&gt; Seq.collect (fun c -&gt; c.Children)

但是很多時候,序列的每個元素本身已經是一個序列 - 例如,您可能有一個列表列表:

let l = [ [1;2]; [3;4]; [5;6] ]

在這種情況下,您傳遞給的參數函式Seq.collect只需要返回參數:

let flattened = [ [1;2]; [3;4]; [5;6] ] |&gt; Seq.collect (fun x -&gt; x)

該表達式fun x -&gt; x是一個只返回其參數的函式,也稱為“恆等函式”。

let flattened = [ [1;2]; [3;4]; [5;6] ] |&gt; Seq.collect id

在使用高階函式(例如Seq.collect上面的函式)時,它的用法經常出現,因此它應該在標準庫中佔有一席之地。

另一個引人注目的例子是Seq.choose- 一個過濾一系列Option值並同時展開它們的函式。例如,您可以通過以下方式將所有字元串解析為數字並丟棄無法解析的字元串:

let tryParse s = match System.Int32.TryParse s with | true, x -&gt; Some x | _ -&gt; None
let strings = [ "1"; "2"; "foo"; "42" ]
let numbers = strings |&gt; Seq.choose tryParse  // numbers = [1;2;42]

但是,如果您已經獲得了一個Option值列表,該怎麼辦?身份功能來拯救!

let toNumbers optionNumbers =
  optionNumbers |&gt; Seq.choose id

引用自:https://stackoverflow.com/questions/44545396