Фа-диез (язык программирования)

язык программирования майкрософт
Фа#
ПарадигмыМультипарадигмальный : функциональный , императивный , объектно-ориентированный , агентно-ориентированный , метапрограммирование , рефлексивный , параллельный
СемьяML : Caml : OCaml
РазработаноДон Сайм , Microsoft Research
РазработчикMicrosoft , Фонд программного обеспечения F#
Впервые появился2005 ; 20 лет назад , версия 1.0 ( 2005 )
Стабильный релиз
9.0 [1]  / 12 ноября 2024 г. ; 2 месяца назад ( 12 ноября 2024 )
Дисциплина набора текстаСтатичный , сильный , предполагаемый
ОСКроссплатформенность : .NET Framework, Mono
ЛицензияМассачусетский технологический институт [2] [3]
Расширения имени файла.fs, .fsi, .fsx, .fsscript
Веб-сайтfsharp.org


Learn.microsoft.com/en-us/dotnet/fsharp
Под влиянием
C# , Erlang , Haskell , [4] ML , OCaml , [5] [6] Python , Scala
Под влиянием
C# , [7] Elm , F* , LiveScript
  • Программирование F Sharp в Wikibooks

F# (произносится как F sharp ) — это универсальный , высокоуровневый , строго типизированный , многопарадигмальный язык программирования , охватывающий функциональные , императивные и объектно-ориентированные методы программирования. Чаще всего он используется как кроссплатформенный язык Common Language Infrastructure (CLI) на .NET , но также может генерировать код JavaScript [8] и графического процессора (GPU). [9]

F# разработан F# Software Foundation , [10] Microsoft и открытыми участниками. Открытый исходный код , кроссплатформенный компилятор для F# доступен в F# Software Foundation. [11] F# — полностью поддерживаемый язык в Visual Studio [12] и JetBrains Rider . [13] Плагины, поддерживающие F#, существуют для многих широко используемых редакторов, включая Visual Studio Code , Vim и Emacs .

F# является членом семейства языков ML и возник как реализация .NET Framework ядра языка программирования OCaml . [5] [6] На него также оказали влияние C# , Python , Haskell , [4] Scala и Erlang .

История

Версии

F#
-версия
Спецификация языкаДатаПлатформыВремя выполнения
1.хМай 2005 г. [14]Окна.NET 1.0 - 3.5
2.0Август 2010 г.Апрель 2010 г. [15]Linux , MacOS , Windows.NET 2.0 - 4.0, Моно
3.0Ноябрь 2012 г.Август 2012 [16]Linux , macOS , Windows ;
JavaScript , [8] Графический процессор [9]
.NET 2.0 - 4.5, Моно
3.1Ноябрь 2013 г.Октябрь 2013 г. [17]Linux , macOS , Windows ;
JavaScript , [8] Графический процессор [9]
.NET 2.0 - 4.5, Моно
4.0Январь 2016 г.Июль 2015 г. [18]
4.1Май 2018 г.Март 2017 г. [19]Linux , MacOS , Windows ,

JavaScript , [8] Графический процессор [9]

.NET 3.5 - 4.6.2, .NET , Моно
4.5Август 2018 [20]Linux , MacOS , Windows ,

JavaScript , [8] Графический процессор [9]

.NET 4.5 - 4.7.2, [21] .NET Core SDK 2.1.400 [22]
4.6Март 2019 [23]Linux , MacOS , Windows ,

JavaScript , [8] Графический процессор [9]

.NET 4.5 - 4.7.2, [24] .NET Core SDK 2.2.300 [25]
4.7Сентябрь 2019 [26]Linux , MacOS , Windows ,

JavaScript , [8] Графический процессор [9]

.NET 4.5 - 4.8, [27] .NET Core SDK 3.0.100 [28]
5.0Ноябрь 2020 г. [29]Linux , MacOS , Windows ,

JavaScript , [8] Графический процессор [9]

.NET SDK 5.0.100 [30]
6.0Ноябрь 2021 г. [31]Linux , MacOS , Windows ,

JavaScript , [8] Графический процессор [9]

.NET SDK 6.0.100 [32]
7.0Ноябрь 2022 г. [33]Linux , MacOS , Windows ,

JavaScript , [8] Графический процессор [9]

.NET SDK 7.0.100 [34]
8.0Ноябрь 2023 г. [35]Linux , MacOS , Windows ,

JavaScript , [8] Графический процессор [9]

.NET SDK 8.0.100 [36]
9.0Ноябрь 2024 г. [37]Linux , MacOS , Windows ,

JavaScript , [8] Графический процессор [9]

.NET SDK 9.0.0 [38]

Эволюция языка

F# использует открытый процесс разработки и проектирования. Процессом эволюции языка руководит Дон Сайм из Microsoft Research в качестве благожелательного пожизненного диктатора (BDFL) для разработки языка совместно с F# Software Foundation. Более ранние версии языка F# были разработаны Microsoft и Microsoft Research с использованием закрытого процесса разработки.

F# впервые был включен в Visual Studio в издании 2010 года на том же уровне, что и Visual Basic (.NET) и C# (хотя и в качестве опции), и остается во всех более поздних изданиях, что делает язык широко доступным и хорошо поддерживаемым.

F# берет свое начало в Microsoft Research, Кембридж, Великобритания. Первоначально язык был разработан и реализован Доном Саймом , [5] по словам которого в команде fsharp говорят, что F означает «Веселье». [39] Эндрю Кеннеди внес вклад в разработку единиц измерения. [5] Visual F# Tools для Visual Studio разработаны корпорацией Microsoft. [5] F# Software Foundation разработала компилятор и инструменты F# с открытым исходным кодом, включив реализацию компилятора с открытым исходным кодом, предоставленную командой Microsoft Visual F# Tools. [10]

Резюме версий
F#
-версия
Добавлены функции
1.0
  • Функциональное программирование
  • Дискриминационные профсоюзы
  • Записи
  • Кортежи
  • Сопоставление с образцом
  • Сокращения типов
  • Объектно-ориентированное программирование
  • Структуры
  • Файлы подписей
  • Файлы скриптов
  • Императивное программирование
  • Модули (без функторов)
  • Вложенные модули
  • Совместимость с .NET
2.0
  • Активные модели
  • Единицы измерения
  • Последовательные выражения
  • Асинхронное программирование
  • Программирование агента
  • Члены расширения
  • Именованные аргументы
  • Необязательные аргументы
  • Нарезка массива
  • Цитаты
  • Собственная совместимость
  • Выражения вычислений
3.0 [40]
  • Поставщики типов
  • Выражения запросов LINQ
  • Атрибут CLIMutable
  • Строки в тройных кавычках
  • Авто-свойства
  • Предоставленные единицы измерения
3.1 [41]
  • Поля типа именованного объединения
  • Расширения для нарезки массива
  • Улучшения вывода типов
4.0 [42]
  • Printf на унифицированных значениях
  • Инициализаторы свойств расширения
  • Ненулевые предоставленные типы
  • Первичные конструкторы как функции
  • Статические параметры для предоставленных методов
  • Интерполяция Printf
  • Расширенная грамматика #if
  • Атрибут Tailcall
  • Множественные реализации интерфейса
  • Необязательные аргументы типа
  • Словари параметров
4.1 [43]
  • Структурные кортежи, взаимодействующие с кортежами C#
  • Структурные аннотации для записей
  • Структурные аннотации для однофакторных дискриминируемых объединений
  • Подчеркивания в числовых литералах
  • Атрибуты аргумента информации о вызывающем абоненте
  • Тип результата и некоторые основные функции результата
  • Взаимно ссылочные типы и модули в одном файле
  • Неявный синтаксис «Модуль» для модулей с общим именем в качестве типа
  • Byref возвращает, поддерживая использование методов возврата ссылок C#
  • Улучшения сообщений об ошибках
  • Поддержка «фиксированного»
4.5 [29]
  • Выравнивание версий двоичного файла, пакета и языка
  • Поддержка «Span<T>» и связанных типов
  • Возможность производить возвраты по принципу «byref»
  • Тип 'voidptr'
  • Типы 'inref<'T>' и 'outref<'T>' для представления 'byref' только для чтения и только для записи
  • Структуры IsByRefLike
  • Структуры IsReadOnly
  • Поддержка метода расширения для 'byref<'T>'/'inref<'T>'/'outref<'T>'
  • ключевое слово «match!» в вычислительных выражениях
  • Ослабленное приведение к базовому типу с помощью «yield» в выражениях F# seq/list/array
  • Уменьшение отступов в выражениях списков и массивов
  • Случаи перечисления, выпущенные как публичные
4.6
  • Анонимные типы записей
4.7 [44]
  • Неявные доходности
  • Больше не требуется двойное подчеркивание
  • Ослабление отступов для параметров, передаваемых конструкторам и статическим методам
  • функция «имя_имени»
  • Открытые статические классы
5.0 [45]
  • FSharp.Core теперь ориентирован только на netstandard2.0
  • Ссылки на пакеты в скриптах F#
  • Поддержка Jupyter, Interact и VSCode Notebooks
  • Интерполяция строк
  • Поддержка nameof
  • Декларации открытого типа
  • Улучшенная нарезка
  • Улучшения цитат F#
  • Выражения аппликационных вычислений
  • Улучшенные трассировки стека в F# async и других вычислительных выражениях
  • Улучшенное взаимодействие с .NET
  • Улучшена производительность Map и Set в FSharp.Core
  • Улучшена производительность компилятора
  • Улучшенный анализ компилятора для авторов библиотек
6.0 [46]
  • Задачи
  • Более простая индексация
  • Дополнения к «активным моделям»
  • Перегруженные пользовательские операции в вычислительных выражениях
  • «как» шаблоны
  • Изменения синтаксиса отступов
  • Больше неявных преобразований
  • Больше неявных преобразований приведения к базовому типу
  • Неявные целочисленные преобразования
  • Первоклассная поддержка неявных преобразований в стиле .NET
  • Необязательные предупреждения о неявных преобразованиях
  • Форматирование двоичных чисел
  • Отбрасывает привязки использования
  • Директива оптимизатора InlineIfLambda
  • Возобновляемый код
  • Больше функций сбора
  • Карта имеет ключи и значения
  • Больше встроенных функций для NativePtr
  • Больше числовых типов с аннотациями единиц измерения
  • Информационные предупреждения для редко используемых символьных операторов
7.0 [47]
  • Поддержка статических абстрактных членов в интерфейсах
  • Упрощение работы с SRTP (статически разрешенными параметрами типа)
  • Проверка необходимых свойств
  • Область действия Init и свойства, доступные только для init
  • Поддержка референтных сборок
  • Автономные развертывания F# и собственный AOT
  • Добавлена ​​поддержка массивов Nd до 32 ранга.
  • Результат модуля функционирует наравне с Option.
  • Исправления в коде генератора возобновляемых конечных автоматов для сборок задач.
  • Лучшая генерация кода для генерируемых компилятором геттеров свойств без побочных эффектов
  • Компилятор для платформы ARM64 и поддержка целевой платформы ARM64 в компиляторе F#. Менеджер зависимостей Поддержка кэширования #r
  • Поддержка параллельной проверки типов и проектов (экспериментальная, может быть включена через настройки VS или авторами инструментов)
  • Различные исправления и улучшения.
8.0 [48]
  • _.Property сокращение для (fun x -> x.Property)
  • Копирование и обновление полей вложенной записи
  • while! (пока бах) особенность [49]
  • Расширенный синтаксис интерполяции строк
  • Использование и составление строковых литералов для printf и связанных функций
  • Арифметические операторы в литералах
  • Синтаксис пересечения ограничений типа
  • Расширенный фиксированный переплет
  • Более простое определение метода [<Extension>]
  • Статические члены в интерфейсах
  • Статичное использование дискриминированных объединений, записей, структур и типов без первичных конструкторов
  • try-with внутри выражений коллекций seq{}, [] и [||]
  • Рекурсивные вызовы и yield! в обработчике исключений
  • Атрибут хвостового вызова
  • [<Struct>] профсоюзы теперь могут иметь > 49 дел
  • Строгие правила отступов
  • Новая диагностика от компилятора
  • Переключатели для распараллеливания компилятора

Обзор языка

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

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

Примеры функциональных особенностей:

F# — это язык на основе выражений, использующий активное вычисление , а также в некоторых случаях ленивое вычисление . Каждое выражение в F#, включая ifвыражения, tryвыражения и циклы, является составным выражением со статическим типом. [52] Функции и выражения, которые не возвращают никаких значений, имеют возвращаемый тип unit. F# использует letключевое слово для привязки значений к имени. [52] Например:

пусть х = 3 + 4     

привязывает значение 7к имени x.

Новые типы определяются с помощью typeключевого слова. Для функционального программирования F# предоставляет типы tuple , record , discriminated union , list , option и result . [52] Кортеж представляет собой набор из n значений, где n ≥ 0. Значение n называется арностью кортежа. 3-кортеж будет представлен как (A, B, C), где A, B и C — значения, возможно, разных типов. Кортеж может использоваться для хранения значений только тогда, когда количество значений известно во время проектирования и остается постоянным во время выполнения.

Запись это тип, в котором элементы данных именуются. Вот пример определения записи:

 тип R = { Имя : строка Возраст : целое }            

Записи могут быть созданы как }. Ключевое слово используется для создания копии записи, как в }, что создает новую запись путем копирования и изменения значения поля (предполагая, что запись, созданная в последнем примере, была названа ).let r = { Name="AB"; Age=42with{ r with Name="CD"rNamer

Тип дискриминируемого объединения — это типобезопасная версия объединений C. Например,

 тип A = | UnionCaseX строки | UnionCaseY целого числа           

Значения типа union могут соответствовать любому случаю union. Типы значений, переносимых каждым случаем union, включены в определение каждого случая.

Тип списка — это неизменяемый связанный список, представленный либо с помощью нотации ( — оператор cons ), либо в сокращенной форме как . Пустой список записывается . Тип параметра — это тип дискриминируемого объединения с вариантами выбора или . Типы F# могут быть универсальными , реализованными как универсальные типы .NET.head::tail::[item1; item2; item3][]Some(x)None

F# поддерживает лямбда-функции и замыкания . [52] Все функции в F# являются значениями первого класса и неизменяемы. [52] Функции могут быть каррированы . Будучи значениями первого класса, функции могут передаваться в качестве аргументов другим функциям. Как и другие функциональные языки программирования, F# допускает композицию функций с использованием операторов >>и <<.

F# обеспечиваетвыражения последовательности [53],которые определяют последовательностьseq { ... }, список[ ... ]или массив[| ... |]через код, который генерирует значения. Например,

 seq { for b in 0 .. 25 do if b < 15 then yield b * b }                

формирует последовательность квадратов чисел от 0 до 14, отфильтровывая числа из диапазона чисел от 0 до 25. Последовательности являются генераторами — значения генерируются по требованию (т. е. вычисляются лениво ), в то время как списки и массивы вычисляются быстро.

F# использует сопоставление с образцом для привязки значений к именам. Сопоставление с образцом также используется при доступе к дискриминированным объединениям — объединение сопоставляет значение с правилами образца, и правило выбирается, когда сопоставление успешно. F# также поддерживает активные образцы как форму расширяемого сопоставления с образцом. [54] Он используется, например, когда существует несколько способов сопоставления по типу. [52]

F# поддерживает общий синтаксис для определения композиционных вычислений, называемыйВыражения вычислений . Выражения последовательностей, асинхронные вычисления и запросы являются особыми видами выражений вычислений. Выражения вычислений являются реализацией шаблонамонады.[53]

Императивное программирование

Поддержка F# для императивного программирования включает

  • for петли
  • while петли
  • массивы , созданные с помощью [| ... |]синтаксиса
  • хэш-таблица , созданная с использованием dict [ ... ]синтаксиса или System.Collections.Generic.Dictionary<_,_>типа.

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

// Определить 'x' с начальным значением '1' let mutable x = 1 // Изменить значение 'x' на '3' x <- 3      

Кроме того, F# поддерживает доступ ко всем типам и объектам CLI, таким как те, которые определены в System.Collections.Genericпространстве имен, определяющем императивные структуры данных.

Объектно-ориентированное программирование

Как и другие языки Common Language Infrastructure (CLI), F# может использовать типы CLI посредством объектно-ориентированного программирования. [52] Поддержка F# объектно-ориентированного программирования в выражениях включает:

  • Точечная нотация, например,x.Name
  • Объектные выражения, например, }{ new obj() with member x.ToString() = "hello"
  • Строительство объектов, например,new Form()
  • Типовые испытания, например,x :? string
  • Приведения типов, например,x :?> string
  • Именованные аргументы, например,x.Method(someArgument=1)
  • Именованные сеттеры, например,new Form(Text="Hello")
  • Необязательные аргументы, например,x.Method(OptionalArgument=1)

Поддержка объектно-ориентированного программирования в шаблонах включает

  • Типовые испытания, например,:? string as s
  • Активные шаблоны, которые могут быть определены по типам объектов [54]

Определения типов объектов F# могут быть определениями типов class, struct, interface, enum или delegate, соответствующими формам определений, найденным в C# . Например, вот класс с конструктором, принимающим имя и возраст и объявляющим два свойства.

/// Простое определение типа объекта type Person ( name : string , age : int ) = member x . Name = name member x . Age = age               

Асинхронное программирование

F# поддерживает асинхронное программирование через асинхронные рабочие процессы . [55] Асинхронный рабочий процесс определяется как последовательность команд внутри async{ ... }, как в

пусть asynctask = async { пусть req = WebRequest.Create ( url ) пусть ! response = req.GetResponseAsync ( ) используйте stream = response.GetResponseStream ( ) используйте streamreader = new System.IO.StreamReader ( stream ) return streamreader.ReadToEnd ( ) }                         

Указывает let!, что выражение справа (получение ответа) должно быть выполнено асинхронно, но поток должен продолжаться только тогда, когда результат доступен. Другими словами, с точки зрения блока кода это как если бы получение ответа было блокирующим вызовом, тогда как с точки зрения системы поток не будет заблокирован и может использоваться для обработки других потоков, пока не станет доступен результат, необходимый для этого.

Асинхронный блок может быть вызван с помощью Async.RunSynchronouslyфункции. Несколько асинхронных блоков могут быть выполнены параллельно с помощью Async.Parallelфункции, которая принимает список asyncобъектов (в примере asynctaskэто асинхронный объект) и создает другой асинхронный объект для параллельного выполнения задач в списках. Результирующий объект вызывается с помощью Async.RunSynchronously. [55]

Инверсия управления в F# следует этой схеме. [55]

Начиная с версии 6.0, F# поддерживает создание, использование и возврат задач .NET напрямую. [56]

 открыть System.Net.Http пусть fetchUrlAsync ( url : string ) = // string - > Task <string> задача { использовать client = new HttpClient ( ) пусть ! response = client.GetAsync ( url ) пусть ! content = response.Content.ReadAsStringAsync ( ) сделать ! Task.Delay 500 вернуть содержимое }                             // Использование let fetchPrint () = let task = task { let! data = fetchUrlAsync " https://example.com" printfn $ " {data}" } task.Wait ()                  

Параллельное программирование

Параллельное программирование поддерживается частично посредством Async.Parallelи Async.Startдругих операций, которые запускают асинхронные блоки параллельно.

Параллельное программирование также поддерживается посредством Array.Parallelоператоров функционального программирования в стандартной библиотеке F#, прямого использования модели System.Threading.Tasksпрограммирования задач, прямого использования пула потоков .NET и потоков .NET, а также посредством динамической трансляции кода F# в альтернативные механизмы параллельного выполнения, такие как код GPU [9] .

Единицы измерения

Система типов F# поддерживает проверку единиц измерения для чисел. [57]

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

Функция единиц измерения интегрируется с выводом типов F#, что требует минимальных аннотаций типов в пользовательском коде. [59]


[< Мера >] тип м // метр [< Мера >] тип с // секунда      пусть расстояние = 100 . 0 < м > // float<m> пусть время = 5 . 0 < с > // float<s> пусть скорость = расстояние / время // float<m/s>            [< Мера >] тип кг // килограмм [< Мера >] тип Н = ( кг * м )/( с ^ 2 ) // Ньютоны [< Мера >] тип Па = Н /( м ^ 2 ) // Паскали               [< Мера >] тип дней пусть better_age = 3u < дни > // uint<дни>       

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

Метапрограммирование

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

F# включает функцию для метапрограммирования во время выполнения, называемую цитатами. [60] Выражение цитаты вычисляется в абстрактное синтаксическое дерево, представляющее выражения F#. Аналогично, определения, помеченные атрибутом, [<ReflectedDefinition>]также могут быть доступны в их форме цитаты. Цитаты F# используются для различных целей, включая компиляцию кода F# в код JavaScript [8] и GPU [9] . Цитаты представляют свои выражения кода F# как данные для использования другими частями программы, при этом требуя, чтобы это был синтаксически правильный код F#.

Информационно-богатое программирование

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

В F# 3.0 функции цитирования и вычислительных выражений F# объединены для реализации запросов LINQ . [63] Например:

// Используйте поставщик типов OData для создания типов, которые можно использовать для доступа к базе данных Northwind. open Microsoft.FSharp.Data.TypeProviders тип Northwind = ODataService < "http://services.odata.org/Northwind/Northwind.svc" > пусть db = Northwind . GetDataContext ()      // Выражение запроса. let query1 = query { for customer in db . Customers do select customer }            

Сочетание поставщиков типов, запросов и строго типизированного функционального программирования известно как информационно-богатое программирование . [64]

Программирование агента

F# поддерживает вариант модели программирования акторов посредством реализации в памяти легких асинхронных агентов. Например, следующий код определяет агента и отправляет 2 сообщения:

 тип сообщения = | Постановка строки в очередь | Вывод AsyncReplyChannel из очереди < Option < string >>           // Предоставляет одновременный доступ к списку строк let listManager = MailboxProcessor . Start ( fun inbox -> let rec messageLoop list = async { let ! msg = inbox . Receive () match msg with | Enqueue item -> return ! messageLoop ( item :: list )                              | Вывести replyChannel -> список соответствия с | [] -> replyChannel . Ответить Нет return ! messageLoop список | head :: tail -> replyChannel . Ответить ( Некоторые head ) return ! messageLoop tail }                            // Запустить цикл с пустым списком messageLoop [] )    // Использование async { // Поставить в очередь несколько строк listManager.Post ( Поставить в очередь "Hello" ) listManager.Post ( Поставить в очередь " World " )        // Извлечь из очереди и обработать строки let! str = listManager.PostAndAsyncReply ( Dequeue ) str |> Option.iter ( printfn " Dequeued : %s" )          } | > Асинхронный .Старт  

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

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

Сравнение интегрированных сред разработки

Области применения

F# — язык программирования общего назначения .

Веб-программирование

SAFE Stack — это сквозной стек F# для разработки веб-приложений. Он использует ASP.NET Core на стороне сервера и Fable на стороне клиента. [68]

Альтернативным сквозным вариантом F# является фреймворк WebSharper . [69]

Разработка кроссплатформенных приложений

F# можно использовать вместе с Visual Studio Tools for Xamarin для разработки приложений для iOS и Android . Библиотека Fabulous обеспечивает более удобный функциональный интерфейс.

Аналитическое программирование

Среди прочего, F# используется для количественного финансового программирования, [70] торговли энергоносителями и оптимизации портфеля, [71] машинного обучения, [72] бизнес-аналитики [73] и социальных игр на Facebook . [74]

В 2010-х годах F# позиционировался как оптимизированная альтернатива C# . Возможность написания скриптов на F# и межъязыковая совместимость со всеми продуктами Microsoft сделали его популярным среди разработчиков. [75]

Скриптинг

F# можно использовать в качестве языка сценариев, в основном для сценариев цикла чтения-вычисления-печати (REPL) для настольных систем. [76]

Сообщество с открытым исходным кодом

Сообщество F# с открытым исходным кодом включает F# Software Foundation [10] и F# Open Source Group на GitHub . [11] Популярные проекты F# с открытым исходным кодом включают:

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

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

В F# реализован устаревший «режим совместимости с ML», который позволяет напрямую компилировать программы, написанные на большом подмножестве OCaml, без функторов, объектов, полиморфных вариантов или других дополнений.

Примеры

Ниже приведено несколько небольших примеров:

// Это комментарий к примеру программы Hello World. printfn "Hello World!" 

Определение типа записи. Записи по умолчанию неизменяемы и сравниваются по структурному равенству.

тип Человек = { Имя : строка Фамилия : строка Возраст : целое }         // Создание экземпляра записи let person = { FirstName = "John" ; LastName = "Doe" ; Age = 30 }             


Класс Person с конструктором, принимающим имя и возраст, а также два неизменяемых свойства.

/// Это комментарий к документации для определения типа. type Person ( name : string , age : int ) = member x . Name = name member x . Age = age /// создание экземпляра класса let mrSmith = Person ( "Smith" , 42 )                    

Простым примером, который часто используется для демонстрации синтаксиса функциональных языков, является функция факториала для неотрицательных 32-битных целых чисел, показанная здесь на F#:

/// Используя выражение сопоставления с образцом, пусть 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 $ "{x}"            /// Итерация с использованием функции высшего порядка let printList2 lst = List . iter ( printfn "%d" ) lst        /// Итерация с использованием рекурсивной функции и сопоставления с образцом let rec printList3 lst = match lst with | [] -> () | h :: t -> printfn "%d" h printList3 t                     

Примеры Фибоначчи:

/// Формула числа Фибоначчи [< TailCall >] пусть fib n = пусть rec g n f0 f1 = сопоставить n с | 0 -> f0 | 1 -> f1 | _ -> g ( n - 1 ) f1 ( f0 + f1 ) g n 0 1                                    /// Другой подход - ленивая бесконечная последовательность чисел Фибоначчи let fibSeq = Seq . unfold ( fun ( a , b ) -> Some ( a + b , ( b , a + b ))) ( 0 , 1 )          // Печать четных чисел fibs [ 1 .. 10 ] |> Список . map fib |> Список . filter ( fun n -> ( n % 2 ) = 0 ) |> printList              // То же самое, используя выражение списка [ for i in 1 .. 10 do let r = fib i if r % 2 = 0 then yield r ] |> printList                     

Пример программы Windows Forms:

// Открываем библиотеку Windows Forms open System.Windows.Forms // Создаем окно и задаем несколько свойств let form = new Form ( Visible = true , TopMost = true , Text = "Welcome to F#" )      // Создаем метку для отображения текста в форме let label = let x = 3 + ( 4 * 5 ) new Label ( Text = $ "{x}" )              // Добавляем метку к форме form.Controls.Add ( label )// Наконец, запустите форму [< System . STAThread >] Application . Run ( form )

Пример асинхронного параллельного программирования (параллельные задачи ЦП и ввода-вывода):

/// Простой детектор простых чисел let isPrime ( n : int ) = let bound = int ( sqrt ( floatn ) ) seq { 2 ..bound } |> Seq .forall ( fun x - > n % x < > 0 )                        // Мы используем асинхронные рабочие процессы let primeAsync n = async { return ( n , isPrime n ) }          /// Возвращаем простые числа от m до n, используя несколько потоков let primes m n = seq { m .. n } |> Seq . map primeAsync |> Async . Parallel |> Async . RunSynchronously |> Array . filter snd |> Array . map fst                     // Запустить тест простых чисел 1000000 1002000 |> Array . iter ( printfn "%d" )      

Смотрите также

Примечания

  1. ^ https://github.com/dotnet/fsharp/releases/tag/v12.9.100-beta.24522.2. {{cite web}}: Отсутствует или пусто |title=( помощь )
  2. ^ "Лицензия F# Software Foundation". GitHub . 14 октября 2021 г.
  3. ^ "Лицензия Microsoft F#". GitHub . 16 октября 2021 г.
  4. ^ аб Сайм, Гранич и Чистернино (2007:2)
  5. ^ abcde "Исторические благодарности F#". Microsoft .
  6. ^ ab Syme, Don (2006). "Использование компонентов метапрограммирования .NET из F#". [F#] основан на архитектуре Core ML и, в частности, имеет базовый язык, в значительной степени совместимый с языком OCaml
  7. ^ для асинхронного
  8. ^ abcdefghijklm The F# Software Foundation. "Использование F# для веб-приложений" . Получено 30 июля 2020 г.
  9. ^ abcdefghijklmn The F# Software Foundation. "Использование F# для программирования GPU". Архивировано из оригинала 2019-12-25 . Получено 2019-12-25 .
  10. ^ abc The F# Software Foundation. "The F# Software Foundation" . Получено 24.11.2012 .
  11. ^ ab The F# Software Foundation. "F# Compiler (open source edition) @ github" . Получено 24.11.2012 .
  12. ^ "Разработка с Visual F# в Visual Studio" . Получено 2020-07-30 .
  13. ^ "F#" . Получено 2020-07-30 .
  14. ^ Сайм, Дон. "F# 1.0.8 выпущен". Microsoft . Получено 7 сентября 2014 г. .
  15. ^ Сайм, Дон. "F# 2.0 выпущен как часть Visual Studio 2010". Microsoft . Получено 7 сентября 2014 г. .
  16. ^ Зандер, Джейсон. "Visual Studio 2012 и .NET Framework 4.5 выпущены в Интернете". Microsoft . Получено 7 сентября 2014 г. .
  17. ^ "Visual Studio 2013 выпущена в сети". Microsoft. 17 октября 2013 г. Получено 7 сентября 2014 г.
  18. ^ "Анонс RTM Visual F# 4.0". Microsoft . Получено 15 сентября 2015 г. .
  19. ^ "Анонс F# 4.1 и Visual F# Tools для Visual Studio 2017" . Получено 2017-03-08 .
  20. ^ "Announcing F# 4.5". Microsoft. 14 августа 2018 г. Получено 14 августа 2018 г.
  21. ^ "FSharp.Core 4.5.0".
  22. ^ "Загрузить .NET Core 2.1 (Linux, macOS и Windows)". Microsoft . Получено 13 мая 2021 г. .
  23. ^ "Announcing F# 4.6". Microsoft. 29 марта 2019 г. Получено 29 марта 2019 г.
  24. ^ "FSharp.Core 4.6.0".
  25. ^ "Загрузить .NET Core 2.2 (Linux, macOS и Windows)". Microsoft . Получено 13 мая 2021 г. .
  26. ^ "Announcing F# 4.7". Microsoft. 23 сентября 2019 г. Получено 23 сентября 2019 г.
  27. ^ "FSharp.Core 4.7.0".
  28. ^ "Загрузить .NET Core 3.0 (Linux, macOS и Windows)". Microsoft . Получено 13 мая 2021 г. .
  29. ^ ab "Анонс F# 5". 10 ноября 2020 г.
  30. ^ "Загрузить .NET 5.0 (Linux, macOS и Windows)". Microsoft . Получено 13 мая 2021 г. .
  31. ^ «F# 6 официально здесь!». 9 ноября 2021 г.
  32. ^ "Загрузить .NET 6.0 (Linux, macOS и Windows)". Microsoft . Получено 14 ноября 2021 г. .
  33. ^ "Анонс F# 7". 8 ноября 2022 г.
  34. ^ "Загрузить .NET 7.0 (Linux, macOS и Windows)". Microsoft . Получено 8 ноября 2022 г. .
  35. ^ "Анонс F# 8". 14 ноября 2023 г.
  36. ^ "Загрузить .NET 8.0 (Linux, macOS и Windows)". Microsoft . Получено 14 ноября 2023 г. .
  37. ^ "Что нового в F# 9". 12 ноября 2024 г.
  38. ^ "Загрузить .NET 9.0 (Linux, macOS и Windows)". Microsoft . Получено 13 января 2025 г. .
  39. ^ Эдвардс, Кэтрин (23 декабря 2008 г.). «Языки программирования от А до Я: F#». Network World . IDG. Архивировано из оригинала 13 ноября 2018 г. Получено 8 августа 2016 г.
  40. ^ Макнамара, Брайан. «Подробнее о возможностях языка F# 3.0». Microsoft . Получено 7 сентября 2014 г.
  41. ^ Макнамара, Брайан. "Анонсируем предварительную версию F# 3.1". Microsoft . Получено 7 сентября 2014 г. .
  42. ^ "Анонс RTM Visual F# 4.0" . Получено 2017-03-08 .
  43. ^ "Анонс F# 4.1 и Visual F# Tools для Visual Studio 2017" . Получено 2017-03-08 .
  44. ^ "Анонс F# 4.7". 23 сентября 2019 г.
  45. ^ "Анонс F# 5". 10 ноября 2020 г.
  46. ^ "Что нового в F# 6 - Руководство по F#". 10 марта 2023 г.
  47. ^ "Анонс F# 7". 8 ноября 2022 г.
  48. ^ "Анонс F# 8". 14 ноября 2023 г.
  49. ^ «Упрощение вычислений F# с помощью нового ключевого слова 'while!'». 20 сентября 2023 г.
  50. ^ "F Sharp Programming/Computation Expressions - Wikibooks, открытые книги для открытого мира". en.wikibooks.org . Получено 21.01.2022 .
  51. ^ kexugit (8 июля 2011 г.). "Хвостовые вызовы в F#". docs.microsoft.com . Получено 22.04.2022 .
  52. ^ abcdefgh "Обзор языка F#" (PDF) . Получено 2007-12-14 .
  53. ^ ab "Некоторые подробности о выражениях вычислений F#" . Получено 14 декабря 2007 г.
  54. ^ ab "Pattern Matching in F# Part 2: Active Patterns". Архивировано из оригинала 2012-12-09 . Получено 2012-11-24 .
  55. ^ abc "Введение в асинхронные рабочие процессы F#" . Получено 14 декабря 2007 г.
  56. ^ "Task Expressions". 19 апреля 2022 г. Получено 15.01.2023 г.
  57. ^ "Единицы измерения (F#)" . Получено 2012-11-24 .
  58. ^ «Расширение единиц измерения для включения большего количества числовых типов». GitHub .
  59. ^ "Единицы измерения в F#: Часть первая, Введение в единицы" . Получено 24.11.2012 .
  60. ^ "Кодовые цитаты (F#)" . Получено 2012-11-24 .
  61. ^ "Поставщики типов" . Получено 24.11.2012 .
  62. ^ "Новый технический отчет от Microsoft Research: поддержка строго типизированного языка для источников информации в масштабе Интернета" . Получено 24.11.2012 .
  63. ^ "Выражения запросов (F#)" . Получено 2012-11-24 .
  64. ^ "F# 3.0 – LINQ + Поставщики типов = Информационно насыщенное программирование" . Получено 24.11.2012 .
  65. Александр Куракин (15 марта 2019 г.). «Rider 2019.1 запускает программу раннего доступа!».
  66. ^ "Использование F# в Windows". F# Software Foundation . Получено 2018-08-07 .
  67. ^ "Features – Rider". JetBrains . Получено 2018-08-07 .
  68. ^ "Fable: JavaScript, которым вы можете гордиться!". fable.io . Получено 2017-12-09 .
  69. ^ Intellifactory. "WebSharper home" . Получено 2012-11-24 .
  70. ^ "Microsoft Case Studies:Microsoft Visual Studio 2012 - Financial Services Firm". Microsoft . Получено 2012-11-25 .
  71. ^ "F# для торговли энергоресурсами и оптимизации портфеля" . Получено 25.11.2012 .
  72. ^ "Исследование случая Microsoft: Grange Insurance". Microsoft . Получено 25.11.2012 .
  73. ^ Трелфорд, Фил (2007). «Изучение с F#». Труды 4-го семинара ACM SIGPLAN по коммерческим пользователям функционального программирования - CUFP '07 . стр.  1– 2. doi :10.1145/1362702.1362709. ISBN 9781450378444. S2CID  24018363 . Получено 25.11.2012 .
  74. ^ "F# Job in Facebook Social Gaming" . Получено 25.11.2012 .
  75. ^ "Отзывы разработчиков F#" . Получено 25 мая 2021 г.
  76. ^ "Скриптинг на F#". 12 сентября 2008 г. Получено 17 января 2020 г.

Ссылки

  • Сайм, Дон ; Гранич, Адам; Чистернино, Антонио (2007), Expert F # , Apress
  • Харроп, Джон (2010), Visual F# 2010 для технических вычислений , Flying Frog Consultancy
  • Пикеринг, Роберт (2007), Основы F# , Apress
  • Смит, Крис (2009), Программирование F# , O'Reilly
  • Петричек, Томас (2009), Функциональное программирование в реальном мире с примерами на F# и C# , Manning Publications
  • Хансен, Майкл; Ришель, Ганс (2013), Функциональное программирование с использованием F # , Cambridge University Press
  • Астборг, Йохан (2013), F# для количественных финансов, Packt Publishing
  • Ландин, Микаэль (2015), Тестирование с помощью F#, Packt Publishing
  • Официальный сайт F# Software Foundation
  • Группа разработчиков открытого исходного кода F# на GitHub
  • Центр разработчиков Visual F# Архивировано 19 ноября 2008 г. на Wayback Machine
  • Попробуйте F#, для изучения F# в веб-браузере
  • Сайт фрагментов F#
  • Блог команды Visual F#
  • Оригинальный веб-сайт Microsoft Research для F#
  • Руководство по выживанию в F#, декабрь 2009 г. (электронная книга)
  • Спецификация языка F#
  • Введение в программирование на F# Архивировано 13 июля 2011 г. на Wayback Machine
  • Учебное пособие, демонстрирующее процесс создания функционального проекта; включает в себя тестирование и параллельное кодирование.
Взято с "https://en.wikipedia.org/w/index.php?title=F_Sharp_(язык_программирования)&oldid=1269320157"