F # logomark | |
Paradigm | Мультипарадигма : функциональный, императивный, объектно-ориентированный, метапрограммирование, рефлексивное, параллельное |
---|---|
семейство | ML |
Разработано | Доном Саймом, Microsoft Research |
Разработчик | Microsoft, The F # Software Foundation |
Впервые появился | 2005; 15 лет назад (2005 г.), версия 1.0 |
Стабильный выпуск | 4.7 / 23 сентября 2019 г.; 13 месяцев назад (23.09.2019) |
Предварительная версия | Предварительная версия 5.0 / 2 апреля 2019 г.; 18 месяцев назад (02.04.2019) |
Дисциплина ввода | Статический, сильный, предполагаемый |
OS | Кросс-платформенный : .NET Framework, Mono |
Лицензия | Лицензия MIT |
Расширения имен файлов | .fs,.fsi,.fsx,.fsscript |
Веб-сайт | fsharp.org |
Под влиянием | |
C#, Erlang, Haskell,ML, OCaml, Python, Scala | |
Под влиянием | |
C#,Elm, F*, LiveScript | |
|
F#(произносится F Sharp ) - это функционально-ориентированное, универсальное, строго типизированное, мультипарадигма язык программирования, который включает в себя методы функционального, императивного и объектно-ориентированного программирования. F # чаще всего используется как кроссплатформенный язык Common Language Infrastructure (CLI) в .NET Core, но он также может генерировать JavaScript и код графического процессора (GPU).
F # разработан F # Software Foundation, Microsoft и открытыми участниками. открытый кроссплатформенный компилятор для F # доступен от F # Software Foundation. F # - это полностью поддерживаемый язык в Visual Studio и. Плагины, поддерживающие F #, существуют для многих широко используемых редакторов, в первую очередь расширения Ionide для Visual Studio Code, а также интеграции для других редакторов, таких как, и Emacs.
F # является членом семейства языков ML и возник как реализация .NET Framework ядра языка программирования OCaml. На него также повлияли C#, Python, Haskell, Scala и Erlang.
В процессе развития язык пережил несколько версий:
Версия | Спецификация языка | Дата | Платформы | Среда выполнения |
---|---|---|---|---|
F # 1.x | Май 2005 г. | Windo ws | .NET 1.0 - 3.5 | |
F # 2.0 | август 2010 г. | апрель 2010 г. | Linux, macOS, Windows | .NET 2.0 - 4.0, Mono |
F # 3.0 | ноябрь 2012 г. | август 2012 г. | Linux, macOS, Windows ;. JavaScript, GPU | .NET 2.0 - 4.5, Mono |
F # 3.1 | ноябрь 2013 г. | октябрь 2013 г. | Linux, macOS, Windows ;. JavaScript, GPU | .NET 2.0 - 4.5, Mono |
F # 4.0 | январь 2016 | июль 2015 г. | ||
F # 4.1 | март 2017 г. | Linux, macOS, Windows, | . NET 3.5 - 4.6.2, .NET Core, Mono | |
F # 4.5 | август 2018 г. | Linux, macOS, Windows, | .NET 4.5 - 4.7.2, .NET Core SDK 2.1.400 | |
F # 4.7 | Сентябрь 2019 г. |
F # использует открытый процесс разработки и проектирования. Процесс эволюции языка управляется Дон Сайм из Microsoft Research в качестве доброжелательного диктатора на всю жизнь (BDFL) в области языкового дизайна вместе с F # Software Foundation.. Предыдущие версии языка F # были разработаны Microsoft и Microsoft Research с использованием закрытого процесса разработки.
F # происходит от Microsoft Research, Кембридж, Великобритания. Первоначально язык был разработан и реализован Доном Саймом, по словам которого в команде fsharp говорят, что F означает "Развлечение". Эндрю Кеннеди внес свой вклад в разработку единиц измерения. Инструменты Visual F # для Visual Studio разработаны Microsoft. F # Software Foundation разработала компилятор и инструменты с открытым исходным кодом F #, включая реализацию компилятора с открытым исходным кодом, предоставленную командой Microsoft Visual F # Tools.
F # 1.0 | F # 2.0 | F # 3.0 | F # 3.1 | F # 4.0 | F # 4.1 | F # 4.5 | F # 4.7 | |
---|---|---|---|---|---|---|---|---|
Добавлены функции. |
|
|
|
|
|
|
|
|
F # - это строго типизированный функционально-первый язык, который использует вывод типов. Программисту не нужно объявлять типы - компилятор выводит типы во время компиляции (вывод типа). F # также допускает явные аннотации типов и требует их в некоторых ситуациях.
F # - это язык на основе выражений, использующий нетерпеливое вычисление, а также в некоторых случаях ленивое вычисление. Каждый оператор в F #, включая выражения if
, выражения и циклы try
, является составным выражением статического типа. Функции и выражения, которые не возвращают никакого значения, имеют тип возвращаемого значения unit
. F # использует ключевое слово let
для привязки значений к имени. Например:
let x = 3 + 4
связывает значение 7
с именем x
.
. Новые типы определяются с помощью ключевого слова type
. Для функционального программирования F # предоставляет типы кортежей, записей, размеченных объединений, списков, опций и результатов. Кортеж представляет набор из n значений, где n ≥ 0. Значение n называется арностью кортежа. Кортеж из трех элементов будет представлен как (A, B, C)
, где A, B и C - значения, возможно, разных типов. Кортеж можно использовать для хранения значений только в том случае, если количество значений известно во время разработки и остается постоянным во время выполнения.
Запись - это тип, в котором названы элементы данных. Вот пример определения записи:
type R = {Name: string Age: int}
Записи могут быть созданы как let r = {Name = "AB"; Возраст = 42}
. Ключевое слово с
используется для создания копии записи, как в {r with Name = "CD"}
, которое создает новую запись путем копирования r
и изменение значения поля Имя
(при условии, что запись, созданная в последнем примере, была названа r
).
A размеченное объединение тип - это типобезопасная версия объединений C. Например,
введите A = | UnionCaseX строки | UnionCaseY of int
Значения типа union могут соответствовать любому случаю объединения. Типы значений, переносимых каждым случаем объединения, включены в определение каждого случая.
Тип списка - это неизменяемый связанный список, представленный либо с использованием нотации head :: tail
(::
- это cons оператор) или сокращение как [item1; item2; item3]
. В пустом списке пишется . Тип опции - это дискриминированный тип объединения с вариантами
Некоторые (x)
или Нет
. Типы F # могут быть универсальными, реализованными как универсальные типы.NET.
F # поддерживает лямбда-функции и замыкания. Все функции в F # являются значениями первого класса и неизменны. Функции могут быть каррированы. Будучи первоклассными значениями, функции могут передаваться в качестве аргументов другим функциям. Как и другие языки функционального программирования, F # позволяет составить функцию с помощью операторов >>
и <<
.
F # предоставляет выражения последовательности, которые определяют последовательность seq {...}
, список [...]
или массив [|... |]
через код, который генерирует значения. Например,
seq {для b в 0.. 25 do, если b < 15 then yield b*b }
образует последовательность квадратов чисел от 0 до 14, отфильтровывая числа из диапазона чисел от 0 до 25. Последовательности генераторы - значения генерируются по запросу (т. е. лениво оцениваются ) - в то время как списки и массивы оцениваются быстро.
F # использует сопоставление с образцом для привязки значений к именам. Сопоставление с образцом также используется при доступе к размеченным объединениям - значение объединения сопоставляется с правилами шаблона, и правило выбирается при успешном сопоставлении. F # также поддерживает активные шаблоны как форму расширяемого сопоставления с образцом. Он используется, например, когда существует несколько способов сопоставления типа.
F # поддерживает общий синтаксис для определения композиционных вычислений, называемых выражениями вычислений. Выражения последовательности, асинхронные вычисления и запросы - это особые виды вычислительных выражений. Вычислительные выражения являются реализацией шаблона monad.
Поддержка F # для императивного программирования включает
for
циклов while
выполняет цикл [|... |]
синтаксисdict [...]
или System.Collections.Generic.Dictionary <_,_>
тип.Значения и поля записи также могут быть помечены как изменяемые
. Например:
// Определите 'x' с начальным значением '1' let mutable x = 1 // Измените значение 'x' на '3' x <- 3
Кроме того, F # поддерживает доступ ко всем типам CLI и объекты, такие как те, что определены в пространстве имен System.Collections.Generic
, определяющие императивные структуры данных.
Как и другие языки Common Language Infrastructure (CLI), F # может использовать типы CLI посредством объектно-ориентированного программирования. Поддержка F # для объектно-ориентированного программирования в выражениях включает:
x.Name
{new obj () с членом x.ToString () = "hello"}
new Form ()
x:? string
x:?>string
x.Method (someArgument = 1)
new Form ( Text = "Hello")
x.Method (OptionalArgument = 1)
Поддержка объектно-ориентированного программирования в шаблонах включает
:? string as s
Определениями типов объектов F # могут быть определения типа класса, структуры, интерфейса, перечисления или делегата, соответствующие формам определения, найденным в C #. Например, вот класс с конструктором, который принимает имя и возраст и объявляет два свойства.
/// Простой тип определения типа объекта Person (name: string, age: int) = member x.Name = name member x.Age = age
F # поддерживает асинхронное программирование через асинхронные рабочие процессы. Асинхронный рабочий процесс определяется как последовательность команд внутри async {...}
, как в
let asynctask = async {let req = WebRequest.Create (url) let! response = req.GetResponseAsync () используйте stream = response.GetResponseStream () используйте streamreader = new System.IO.StreamReader (stream) return streamreader.ReadToEnd ()}
let!
указывает, что выражение справа (получение ответа) должно выполняться асинхронно, но поток должен продолжаться только тогда, когда доступен результат. Другими словами, с точки зрения блока кода, это как если бы получение ответа было блокирующим вызовом, тогда как с точки зрения системы поток не будет заблокирован и может использоваться для обработки других потоков. а результат, необходимый для этого, недоступен.
Асинхронный блок может быть вызван с помощью функции Async.RunSynchronously
. Несколько блоков async могут выполняться параллельно с помощью функции Async.Parallel
, которая принимает список объектов async
(в этом примере asynctask
является объектом async) и создает еще один асинхронный объект для параллельного выполнения задач в списках. Результирующий объект вызывается с использованием Async.RunSynchronously
. Инверсия управления в F # следует этому шаблону.
Параллельное программирование поддерживается частично с помощью Async.Parallel
, Async.Start
и других операций, которые запускают асинхронные блоки параллельно.
Параллельное программирование также поддерживается с помощью операторов функционального программирования Array.Parallel
в стандартной библиотеке F #, прямого использования модели программирования задач System.Threading.Tasks
, прямое использование пула потоков.NET и потоков.NET и посредством динамической трансляции кода F # в альтернативные механизмы параллельного выполнения, такие как код GPU.
Система типов F # поддерживает проверку единиц измерения на числа. Функция единиц измерения интегрируется с выводом типа F #, чтобы требовать минимальных аннотаций типов в коде пользователя.
F # позволяет настраивать некоторые формы синтаксиса через метапрограммирование для поддержки встраивания пользовательские предметно-ориентированные языки в языке F #, в частности, посредством выражений вычислений.
F # включает функцию метапрограммирования времени выполнения, называемую цитатами. Выражение цитаты оценивается как представление дерева абстрактного синтаксиса выражений F #. Точно так же определения, помеченные атрибутом [
, также доступны в их форме цитаты. Цитаты F # используются для различных целей, в том числе для компиляции кода F # в код JavaScript и GPU. (Кавычки представляют их выражения кода F # как данные для использования другими частями программы, требуя, чтобы это был синтаксически правильный код F #).
F # 3.0 представил форму метапрограммирования во время компиляции посредством создания статически расширяемых типов, называемых поставщиками типов F #. Поставщики типов F # позволяют расширять компилятор и инструменты F # с помощью компонентов, которые предоставляют информацию о типе компилятору по запросу во время компиляции. Поставщики типов F # использовались для предоставления строго типизированного доступа к подключенным источникам информации масштабируемым образом, в том числе к графу знаний Freebase.
В F # 3.0 функции цитирования и вычислений F # являются объединены для реализации запросов LINQ. Например:
// Используйте поставщик типа OData для создания типов, которые можно использовать для доступа к базе данных Northwind. open Microsoft.FSharp.Data.TypeProviders type Northwind = ODataService <"http://services.odata.org/Northwind/Northwind.svc">let db = Northwind.GetDataContext () // Выражение запроса. let query1 = query {для клиента в базе данных. Клиенты действительно выбирают клиента}
Комбинация поставщиков типов, запросов и строго типизированного функционального программирования известна как информационно-насыщенное программирование.
F # поддерживает вариант модели программирования Actor посредством реализации облегченных асинхронных агентов в памяти. Например, следующий код определяет агента и отправляет 2 сообщения:
let counter = MailboxProcessor.Start (fun inbox ->let rec loop n = async {do printfn "n =% d, wait..." n let ! msg = inbox.Receive () return! loop (n + msg)} loop 0)
F # - это язык программирования общего назначения.
SAFE Stack - это сквозной стек F # для разрабатывать веб-приложения. Он использует ASP.NET Core на стороне сервера и Fable на стороне клиента.
Альтернативным сквозным вариантом F # является платформа WebSharper.
F # можно использовать вместе с Visual Studio Tools для Xamarin для разработки приложений для iOS и Android. Библиотека Fabulous обеспечивает более удобный функциональный интерфейс.
Среди прочего, F # используется для количественного финансового программирования, торговли энергией и оптимизации портфеля, машинного обучения, бизнес-аналитики и социальных игр на Facebook.
В 2010-х годах, F # позиционируется как оптимизированная альтернатива C #. Возможность написания сценариев F # и межъязыковая совместимость со всеми продуктами Microsoft сделали его популярным среди разработчиков. Многие разработчики создают системы на основе F # и используют C # WCF Services.
F # можно использовать в качестве языка сценариев, в основном для настольных компьютеров читать– eval – print loop (REPL) сценарии.
Сообщество с открытым исходным кодом F # включает F # Software Foundation и F # Open Source Группа в GitHub. Популярные проекты F # с открытым исходным кодом включают:
F # имеет устаревший «режим совместимости с ML», который может напрямую компилироваться программы, написанные на большом подмножестве OCaml, грубо говоря, без функторов, объектов, полиморфные варианты или другие дополнения.
Далее следуют несколько небольших примеров:
// Это комментарий для примера программы hello world. printfn "Привет, мир!"
Класс Person с конструктором, принимающим имя, возраст и два неизменяемых свойства.
/// Это комментарий документации для определения типа. type Person (name: string, age: int) = member x.Name = name member x.Age = age /// создание экземпляра класса let mrSmith = Person ("Smith", 42)
Простой пример, который часто используется для демонстрации синтаксиса функциональных языков используется функция факториала для неотрицательных 32-битных целых чисел, здесь показанная в F #:
/// Использование выражения сопоставления с образцом let rec factorial n = match n with | 0 ->1 | _ ->n * factorial (n - 1) /// Для функций с одним аргументом есть синтаксический сахар (функция сопоставления с образцом): let rec factorial = function | 0 ->1 | n ->n * factorial (n - 1) /// Использование оператора свертки и диапазона let factorial n = [1..n] |>Seq.fold (*) 1
Примеры итераций:
/// Итерация с использованием цикла for let printList lst = for x in lst do printfn "% d" x /// Итерация с использованием функции высшего порядка let printList2 lst = List.iter (printfn "% d") lst /// Итерация с использованием рекурсивной функции и сопоставления с образцом позволяет rec printList3 lst = сопоставить lst с | ->() | h :: t ->printfn "% d" h printList3 t
Примеры Фибоначчи:
/// Числовая формула Фибоначчи let fib n = let rec g n f0 f1 = сопоставление n с | 0 ->f0 | 1 ->f1 | _ ->g (n - 1) f1 (f0 + f1) gn 0 1 /// Другой подход - ленивая бесконечная последовательность чисел Фибоначчи пусть fibSeq = Seq.unfold (fun (a, b) ->Some (a + b, (b, a + b))) (0,1) // Вывести четные fibs [1.. 10] |>List.map fib |>List.filter (fun n ->(n% 2) = 0) |>printList // То же самое, используя выражение списка [для i в 1..10 действительно let r = fib i, если r% 2 = 0, то вывести r] |>printList
Пример программы Windows Forms:
// Открываем библиотеку Windows Forms open System.Windows.Forms // Создаем окно и устанавливаем несколько свойств let form = new Form (Visible = true, TopMost = true, Text = "Добро пожаловать в F #") // Создание метка для отображения некоторого текста в форме let label = let x = 3 + (4 * 5) new Label (Text = sprintf "x =% d" x) // Добавить метку в форму form.Controls.Add ( label) // Наконец, запускаем форму [] Application.Run (form)
Пример асинхронного параллельного программирования (параллельный ЦП и задачи ввода-вывода):
/// Простой детектор простых чисел let isPrime (n: int) = let bound = int (sqrt (float n)) seq {2.. boun d} |>Seq.forall (fun x ->n% x <>0) // Мы используем асинхронные рабочие процессы let primeAsync n = async {return (n, isPrime n)} /// Возвращаем простые числа между m и n использование нескольких потоков позволяет использовать простые числа mn = seq {m.. n} |>Seq.map primeAsync |>Async.Parallel |>Async.RunSynchronously |>Array.filter snd |>Array.map fst // Запускать тестовые простые числа 1000000 1002000 |>Array.iter (printfn "% d")
| journal =
()| journal =
()| journal =
()| journal =
()| journal =
()| journal =
()| journal =
()| journal =
()В Викиучебнике есть книга по теме: F Sharp Programming |