F Sharp (язык программирования)

редактировать
Язык программирования Microsoft
F#
Fsharp logo.png 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.

Содержание

  • 1 История
    • 1.1 Версии
    • 1.2 Развитие языка
  • 2 Обзор языка
    • 2.1 Функциональное программирование
    • 2.2 Императивное программирование
    • 2.3 Объектно-ориентированное программирование
    • 2.4 Асинхронное программирование
    • 2.5 Параллельное программирование
    • 2.6 Единицы измерения
    • 2.7 Метапрограммирование
    • 2.8 Информационно-насыщенное программирование
    • 2.9 Программирование агентов
  • 3 Инструменты разработки
  • 4 Области приложений
    • 4.1 Веб-программирование
    • 4.2 Разработка кроссплатформенных приложений
    • 4.3 Аналитическое программирование
    • 4.4 Сценарии
  • 5 Сообщество открытого кода
  • 6 Совместимость
  • 7 Примеры
  • 8 См. Также
  • 9 Примечания
  • 10 Ссылки
  • 11 Внешние ссылки

История

Версии

В процессе развития язык пережил несколько версий:

ВерсияСпецификация языкаДатаПлатформы Среда выполнения
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,

JavaScript, GPU

. NET 3.5 - 4.6.2, .NET Core, Mono
F # 4.5август 2018 г.Linux, macOS, Windows,

JavaScript, GPU

.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.0F # 2.0F # 3.0F # 3.1F # 4.0F # 4.1F # 4.5F # 4.7
Добавлены функции.
  • Функциональное программирование
  • Дискриминированные объединения
  • Записи
  • Кортежи
  • Сопоставление с образцом
  • Сокращения типов
  • Объектно-ориентированное программирование
  • Структуры
  • Файлы подписей
  • Файлы сценариев
  • Императивное программирование
  • Модули (без функторов)
  • Вложенные модули
  • .NET Interoperability
  • Активные шаблоны
  • Единицы измерения
  • Выражения последовательности
  • Асинхронное программирование
  • Программирование агента
  • Элементы расширения
  • Именованные аргументы
  • Необязательные аргументы
  • Нарезка массива
  • Котировки
  • Родное взаимодействие rability
  • Выражения вычислений
  • Поставщики типов
  • Выражения запросов LINQ
  • Атрибут CLIMutable
  • Строки в тройных кавычках
  • Авто-свойства
  • Предоставленные единицы измерения
  • Поля типа именованного объединения
  • Расширения для сечения массива
  • Улучшения вывода типов
  • Printf для единичных значений
  • Инициализаторы свойств расширения
  • Предоставленные типы, отличные от null
  • Первичные конструкторы как функции
  • Статические параметры для предоставленных методов
  • Интерполяция Printf
  • Расширенная грамматика #if
  • Атрибут Tailcall
  • Множественные экземпляры интерфейса
  • Необязательные аргументы типа
  • Словари параметров
  • Кортежи структур, которые взаимодействуют с кортежами C #
  • Структурные аннотации для записей
  • Структурные аннотации для одноразовых дискриминированных объединений
  • Подчеркивание в числовых литералах
  • Атрибуты аргумента информации о вызывающем абоненте
  • Тип результата и некоторые основные функции результатов
  • Взаимно ссылочные типы и модули в одном файле
  • Неявный синтаксис «модуля» для модулей с общим именем в качестве типа
  • Возвращает Byref, поддерживая использование методов возврата ссылки C #
  • Улучшения сообщений об ошибках
  • Поддержка «фиксированного»
  • Выравнивание версий двоичного кода, пакета и языка
  • Поддержка «Span » и связанных типов
  • Возможность для создания 'byref' возвращает
  • Тип 'voidptr'
  • Типы 'inref <'T>' и 'outref <'T>' для представления только для чтения и только для записи byref
  • 'IsByRefLike' структуры
  • 'IsReadOnly' структуры
  • Поддержка метода расширения для 'byref <'T>' / 'inref <'T>' / 'outref <'T>'
  • ' match! ' ключевое слово в выражениях вычислений
  • Ослабленное приведение к исходному состоянию с 'yield' в выражениях F # seq / list / array
  • Ослабленный отступ с выражениями списка и массива
  • Варианты перечисления, выдаваемые как общедоступные
  • Неявные выходы
  • Больше не требуется двойное подчеркивание
  • Ослабление отступов для параметров, передаваемых в конструкторы и статические методы
  • 'nameof' function
  • Открытие статических классов

Обзор языка

Функциональное программирование

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 # для императивного программирования включает

Значения и поля записи также могут быть помечены как изменяемые. Например:

// Определите '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

Asynchronous programming

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)

Инструменты разработки

  • Visual Studio с установленными инструментами Visual F # от Microsoft могут использоваться для создания, запуска и отладки проектов F #. Инструменты Visual F # включают размещенную в Visual Studio интерактивную консоль цикл чтения – оценки – печати (REPL), которая может выполнять код F # по мере его написания. Visual Studio для Mac также полностью поддерживает проекты F #.
  • Код Visual Studio содержит полную поддержку F # через расширение Ionide..
  • F # можно разрабатывать с помощью любого текстового редактора. Специальная поддержка существует в редакторах, таких как Emacs.
  • JetBrains Rider оптимизирован для разработки кода F #, начиная с выпуска 2019.1.
  • LINQPad поддерживает F # с версии 2.x.

Области приложений

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 # с открытым исходным кодом включают:

  • Fable, транспилятор F # в Javascript на основе Babel.
  • Paket, альтернативного менеджера пакетов. для.NET, который все еще может использовать репозитории NuGet, но имеет централизованное управление версиями.
  • FAKE, дружественная к F # система сборки.
  • Giraffe, функционально ориентированное промежуточное ПО для ASP.NET Core.
  • Suave, облегченного веб-сервера и библиотеки для веб-разработки.

Совместимость

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")

См. Также

  • Портал бесплатного программного обеспечения с открытым исходным кодом

Примечания

Ссылки

  • Сайм, Дон ; Гранич, Адам; Чистернино, Антонио (2007). «Эксперт F #». Apress. Cite journal требуется | journal =()
  • Harrop, Jon (2010). «Visual F # 2010 для технических вычислений». Flying Frog Consultancy. Cite journal требует | journal =()
  • Пикеринг, Роберт (2007). «Основы F #». Apress. Cite journal требуется | journal =()
  • Smith, Chris (2009). «Programming F #». O'Reilly. Cite journal требует | journal =()
  • Петричек, Томас (2009). «Функциональное программирование в реальном мире с примерами на F # и C #». Manning Publications. Для цитирования журнала требуется | journal =()
  • Hansen, Michael; Rischel, Hans (2013). «Функциональное программирование с использованием F #». Cambridge University Press. Cite journal требует | journal =()
  • Астборг, Йохан (2013). «F # для количественных финансов». Packt Publishing. Для цитирования журнала требуется | journal =()
  • Лундин, Микаэль (2015). «Тестирование с F #». Packt Publishing. Для цитирования журнала требуется | journal =()

Внешние ссылки

В Викиучебнике есть книга по теме: F Sharp Programming
Последняя правка сделана 2021-05-20 08:31:07
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте