Что такое F#

F # — это управляемый, кросс-платформенный язык программирования с открытым кодом для написания краткого, надежного и производительного кода. Основное внимание уделяется вашей проблемной области, а не сведениям о программировании.

Программирование на F # ориентировано на данные, где код включает преобразование данных с помощью функций.

open System // Gets access to functionality in System namespace.

// Defines a list of names
let names = [ "Peter"; "Julia"; "Xi" ]

// Defines a function that takes a name and produces a greeting.
let getGreeting name = $"Hello, {name}"

// Prints a greeting for each name!
names
|> List.map getGreeting
|> List.iter (fun greeting -> printfn $"{greeting}! Enjoy your F#")

F # содержит множество функций, включая:

  • Упрощенный синтаксис
  • Неизменяемый по умолчанию
  • Определение типа и автоматическое обобщение
  • Функции первого класса
  • Мощные типы данных
  • Регулярные выражения
  • Асинхронное программирование

Полный набор функций приведен в документе с инструкциями по языку F #.

Типы данных с богатыми возможностями

Типы, такие как записи и Размеченные объединения , позволяют представлять данные.

// Group data with Records
type SuccessfulWithdrawal =
    { Amount: decimal
      Balance: decimal }

type FailedWithdrawal =
    { Amount: decimal
      Balance: decimal
      IsOverdraft: bool }

// Use discriminated unions to represent data of 1 or more forms
type WithdrawalResult =
    | Success of SuccessfulWithdrawal
    | InsufficientFunds of FailedWithdrawal
    | CardExpired of System.DateTime
    | UndisclosedFailure

Записи F # и размеченные объединения не равны NULL, неизменяемы и сравнимы по умолчанию, что делает их очень простыми в использовании.

Правильность с функциями и сопоставлением шаблонов

Функции F # легко определить. В сочетании с сопоставлением шаблоновони позволяют определить поведение, корректность которого обеспечивается компилятором.

// Returns a WithdrawalResult
let withdrawMoney amount = // Implementation elided

let handleWithdrawal amount =
    let w = withdrawMoney amount

    // The F# compiler enforces accounting for each case!
    match w with
    | Success s -> printfn "Successfully withdrew %f{s.Amount}"
    | InsufficientFunds f -> printfn "Failed: balance is %f{f.Balance}"
    | CardExpired d -> printfn "Failed: card expired on {d}"
    | UndisclosedFailure -> printfn "Failed: unknown :("

Функции F # также являются первыми классами, то есть они могут передаваться в качестве параметров и возвращаться из других функций.

Функции для определения операций с объектами

F # обеспечивает полную поддержку объектов, которые полезны, когда требуется смешать данные и функциональные возможности. Для работы с объектами можно определять члены и функции F #.

type Set<'T when 'T: comparison>(elements: seq<'T>) =
    member s.IsEmpty = // Implementation elided
    member s.Contains (value) =// Implementation elided
    member s.Add (value) = // Implementation elided
    // ...
    // Further Implementation elided
    // ...
    interface IEnumerable<‘T>
    interface IReadOnlyCollection<‘T>

module Set =
    let isEmpty (set: Set<'T>) = set.IsEmpty

    let contains element (set: Set<'T>) = set.Contains(element)

    let add value (set: Set<'T>) = set.Add(value)

В F # часто создается код, который обрабатывает объекты как тип для функций, которыми необходимо управлять. Такие функции, как универсальные интерфейсы, выражения объектови разумное использование элементов , являются общими в более крупных программах F #.

Следующие шаги

Дополнительные сведения о большем наборе функций F # см. в обзоре f #.