.net f# identity

.net - ¿Cuál es el propósito de la función `id` en el FSharp.Core?



f# identity (2)

Al trabajar con funciones de orden superior (es decir, funciones que devuelven otras funciones y / o toman otras funciones como parámetros), siempre debe proporcionar algo como parámetro, pero no siempre hay una transformación de datos real que desee aplicar .

Por ejemplo, la función Seq.collect aplana una secuencia de secuencias y toma una función que devuelve la secuencia "anidada" para cada elemento de la secuencia "exterior". Por ejemplo, así es como puede obtener la lista de todos los nietos de un control de IU de algún tipo:

let control = ... let allGrandChildren = control.Children |> Seq.collect (fun c -> c.Children)

Pero muchas veces, cada elemento de la secuencia ya será una secuencia en sí misma; por ejemplo, puede tener una lista de listas:

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

En este caso, la función de parámetro que pasa a Seq.collect necesita simplemente devolver el argumento:

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

Esta expresión fun x -> x es una función que simplemente devuelve su argumento, también conocida como " función de identidad ".

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

Su uso aparece tan a menudo cuando se trabaja con funciones de orden superior (como Seq.collect anterior) que merece un lugar en la biblioteca estándar.

Otro ejemplo convincente es Seq.choose - una función que filtra una secuencia de valores Option y los desenvuelve al mismo tiempo. Por ejemplo, así es como puede analizar todas las cadenas como números y descartar aquellos que no se pueden analizar:

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]

Pero, ¿y si ya se le ha dado una lista de valores de Option para comenzar? La función de identidad para el rescate!

let toNumbers optionNumbers = optionNumbers |> Seq.choose id

Desde la función Operators.id <''T> (F #) :

La función de identidad.

Parámetros: x Tipo: ''T (El valor de entrada)

Valor de retorno: el mismo valor

F # Core Library Versions, compatible con: 2.0, 4.0, Portable

¿Por qué hay una función que devuelve su entrada?


Es útil para ciertas funciones de orden superior (funciones que toman funciones como argumentos) para que pueda pasar el id como argumento en lugar de escribir la lambda (fun x -> x) .

[[1;2]; [3]] |> List.collect id // [1; 2; 3]