Novedades de F# 4.6

F# 4.6 agrega varias mejoras al lenguaje F#.

Introducción

F# 4.6 está disponible en todas las distribuciones de .NET Core y las herramientas de Visual Studio. Introducción a F# para obtener más información.

Registros anónimos

Los registros anónimos son un nuevo tipo de F# introducido en F# 4.6. Se trata de agregados simples de valores con nombre que no es necesario declarar antes de su uso. Puede declararlos como estructuras o tipos de referencia. De forma predeterminada, son tipos de referencia.

open System

let getCircleStats radius =
    let d = radius * 2.0
    let a = Math.PI * (radius ** 2.0)
    let c = 2.0 * Math.PI * radius

    {| Diameter = d; Area = a; Circumference = c |}

let r = 2.0
let stats = getCircleStats r
printfn "Circle with radius: %f has diameter %f, area %f, and circumference %f"
    r stats.Diameter stats.Area stats.Circumference

También se pueden declarar como estructuras cuando se quiere agrupar tipos de valor y funcionan en escenarios en los que el rendimiento es fundamental:

open System

let getCircleStats radius =
    let d = radius * 2.0
    let a = Math.PI * (radius ** 2.0)
    let c = 2.0 * Math.PI * radius

    struct {| Diameter = d; Area = a; Circumference = c |}

let r = 2.0
let stats = getCircleStats r
printfn "Circle with radius: %f has diameter %f, area %f, and circumference %f"
    r stats.Diameter stats.Area stats.Circumference

Son muy eficaces y se pueden usar en numerosos escenarios. Obtenga más información en Registros anónimos.

Funciones ValueOption

El tipo ValueOption que se agregó en F# 4.5 ahora tiene "paridad de función enlazada al módulo" con el tipo Option. Estos son algunos de los ejemplos más usados:

// Multiply a value option by 2 if it has  value
let xOpt = ValueSome 99
let result = xOpt |> ValueOption.map (fun v -> v * 2)

// Reverse a string if it exists
let strOpt = ValueSome "Mirror image"
let reverse (str: string) =
    match str with
    | null
    | "" -> ValueNone
    | s ->
        str.ToCharArray()
        |> Array.rev
        |> string
        |> ValueSome

let reversedString = strOpt |> ValueOption.bind reverse

Esto permite usar ValueOption igual que Option en escenarios en los que tener un tipo de valor mejora el rendimiento.