Новые возможности F# 4.6

F# 4.6 добавляет несколько улучшений на язык F#.

Начать

F# 4.6 доступен во всех дистрибутивах .NET Core и инструментах Visual Studio. Приступая к работе с F# , чтобы узнать больше.

Анонимные записи

Анонимные записи — это новый тип F#, представленный в F# 4.6. Они представляют собой простые агрегаты именованных значений, которые не нужно объявлять перед использованием. Их можно объявить как структуры или ссылочные типы. По умолчанию они ссылаются на типы.

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

Они также могут быть объявлены как структуры, когда требуется группировать типы значений и работают в сценариях с учетом производительности:

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

Они довольно мощны и могут использоваться в многочисленных сценариях. Дополнительные сведения см. в анонимных записях.

Функции ValueOption

Тип ValueOption, добавленный в F# 4.5, теперь имеет "четность функций, привязанных к модулю" с типом Option. Ниже приведены некоторые из наиболее распространенных примеров.

// 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

Это позволяет использовать ValueOption так же, как и параметр в сценариях, когда тип значения повышает производительность.