Jump to content

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

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


учиться .microsoft /en-нас /дотнет /fsharp
Под влиянием
С# , Эрланг , Хаскелл , [ 3 ] ML , OCaml , [ 4 ] [ 5 ] Питон , Скала
Под влиянием
С# , [ 6 ] Вяз , F* , LiveScript

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

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

F# является членом семейства языков ML и возник как реализация .NET Framework ядра языка программирования OCaml . [ 4 ] [ 5 ] На него также повлиял C# , Питон , Хаскель , [ 3 ] Скала и Эрланг .

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

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

.NET 3.5 - 4.6.2, .NET , Mono
4.5 август 2018 г. [ 19 ] Linux , MacOS , Windows ,

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

.NET 4.5 – 4.7.2, [ 20 ] Пакет SDK для .NET Core 2.1.400 [ 21 ]
4.6 март 2019 г. [ 22 ] Linux , MacOS , Windows ,

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

.NET 4.5 – 4.7.2, [ 23 ] Пакет SDK для .NET Core 2.2.300 [ 24 ]
4.7 сентябрь 2019 г. [ 25 ] Linux , MacOS , Windows ,

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

.NET 4.5–4.8, [ 26 ] Пакет SDK для .NET Core 3.0.100 [ 27 ]
5.0 ноябрь 2020 г. [ 28 ] Linux , MacOS , Windows ,

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

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

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

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

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

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

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

.NET SDK 8.0.100 [ 35 ]

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

[ редактировать ]

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

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

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

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

Обзор языка

[ редактировать ]

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

[ редактировать ]

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

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

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

let x = 3 + 4

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

Новые типы определяются с помощью type ключевое слово. Для функционального программирования F# предоставляет типы кортеж , запись , дискриминируемое объединение , список , параметр и результат . [ 49 ] Кортеж представляет собой набор из n значений, где n ≥ 0. Значение n называется арностью кортежа. Тройной кортеж будет представлен как (A, B, C), где A, B и C — значения, возможно, разных типов. Кортеж можно использовать для хранения значений только в том случае, если количество значений известно во время разработки и остается постоянным во время выполнения.

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

 type R = 
        { Name : string 
         Age : int }

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

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

 type A = 
    | UnionCaseX of string
    | UnionCaseY of int

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

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

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

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

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

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

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

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

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

[ редактировать ]

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

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

// Define 'x' with initial value '1'
let mutable x = 1
// Change the value of 'x' to '3'
x <- 3

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

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

[ редактировать ]

Как и другие языки Common Language Infrastructure (CLI), F# может использовать типы CLI посредством объектно-ориентированного программирования. [ 49 ] Поддержка 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
  • Активные шаблоны, которые можно определить для типов объектов. [ 51 ]

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

/// A simple object type definition
type Person(name : string, age : int) =
    member x.Name = name
    member x.Age = age

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

[ редактировать ]

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

let asynctask = 
    async { let req = WebRequest.Create(url)
            let! response = req.GetResponseAsync()
            use stream = response.GetResponseStream()
            use streamreader = new System.IO.StreamReader(stream)
            return streamreader.ReadToEnd() }

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

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

Инверсия управления в F# соответствует этому шаблону. [ 52 ]

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

    open System.Net.Http
    let fetchUrlAsync (url:string) = // string -> Task<string>
        task {
            use client = new HttpClient()
            let! response = client.GetAsync(url) 
            let! content = response.Content.ReadAsStringAsync()
            do! Task.Delay 500
            return content
        }

    // Usage
    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 # в альтернативные механизмы параллельного выполнения, такие как графический процессор. [ 8 ] код.

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

[ редактировать ]

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

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

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


[<Measure>] type m                  // meter
[<Measure>] type s                  // second

let distance = 100.0<m>     // float<m>
let time = 5.0<s>           // float<s>
let speed = distance/time   // float<m/s>


[<Measure>] type kg                 // kilogram
[<Measure>] type N = (kg * m)/(s^2) // Newtons
[<Measure>] type Pa = N/(m^2)       // Pascals 

[<Measure>] type days 
let better_age = 3u<days>          // uint<days>

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

Metaprogramming

[ редактировать ]

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

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

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

[ редактировать ]

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

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

// Use the OData type provider to create types that can be used to access the Northwind database.
open Microsoft.FSharp.Data.TypeProviders

type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc">
let db = Northwind.GetDataContext()

// A query expression.
let query1 = query { for customer in db.Customers do
                     select customer }

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

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

[ редактировать ]

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

    type Message =
        | Enqueue of string
        | Dequeue of AsyncReplyChannel<Option<string>>

    // Provides concurrent access to a list of strings
    let listManager = MailboxProcessor.Start(fun inbox ->
        let rec messageLoop list = async {
            let! msg = inbox.Receive()
            match msg with
                | Enqueue item ->
                    return! messageLoop (item :: list)

                | Dequeue replyChannel ->
                    match list with
                    | [] -> 
                        replyChannel.Reply None
                        return! messageLoop list
                    | head :: tail ->
                        replyChannel.Reply (Some head)
                        return! messageLoop tail
        }

        // Start the loop with an empty list
        messageLoop []
    )

    // Usage 
    async {
        // Enqueue some strings
        listManager.Post(Enqueue "Hello")
        listManager.Post(Enqueue "World")

        // Dequeue and process the strings
        let! str = listManager.PostAndAsyncReply(Dequeue)
        str |> Option.iter (printfn "Dequeued: %s")

    }
    |> Async.Start

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

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

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

[ редактировать ]

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

[ редактировать ]

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

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

[ редактировать ]

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

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

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

[ редактировать ]

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

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

[ редактировать ]

Помимо прочего, F# используется для количественного финансового программирования, [ 67 ] торговля энергией и оптимизация портфеля, [ 68 ] машинное обучение, [ 69 ] бизнес-аналитика [ 70 ] и социальные игры на Facebook . [ 71 ]

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

Сценарии

[ редактировать ]

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

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

[ редактировать ]

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

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

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

[ редактировать ]

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

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

// This is a comment for a sample hello world program.
printfn "Hello World!"

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

type Person = {
    FirstName: string
    LastName: string
    Age: int
}

// Creating an instance of the record
let person = { FirstName = "John"; LastName = "Doe"; Age = 30 }


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

/// This is a documentation comment for a type definition.
type Person(name : string, age : int) =
    member x.Name = name
    member x.Age = age
    
/// class instantiation
let mrSmith = Person("Smith", 42)

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

/// Using pattern matching expression
let rec factorial n =
    match n with
    | 0 -> 1
    | _ -> n * factorial (n - 1)

/// For a single-argument functions there is syntactic sugar (pattern matching function):
let rec factorial = function 
    | 0 -> 1 
    | n -> n * factorial (n - 1)
    
/// Using fold and range operator
let factorial n = [1..n] |> Seq.fold (*) 1

Примеры итераций:

/// Iteration using a 'for' loop
let printList lst = 
    for x in lst do
        printfn $"{x}" 

/// Iteration using a higher-order function
let printList2 lst = 
    List.iter (printfn "%d") lst

/// Iteration using a recursive function and pattern matching
let rec printList3 lst =
    match lst with
    | [] -> ()
    | h :: t ->
        printfn "%d" h
        printList3 t

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

/// Fibonacci Number formula
[<TailCall>]
let fib n =
    let rec g n f0 f1 =
        match n with
        | 0 -> f0
        | 1 -> f1
        | _ -> g (n - 1) f1 (f0 + f1)
    g n 0 1

/// Another approach - a lazy infinite sequence of Fibonacci numbers
let fibSeq = Seq.unfold (fun (a,b) -> Some(a+b, (b, a+b))) (0,1)

// Print even fibs
[1 .. 10]
|> List.map     fib
|> List.filter  (fun n -> (n % 2) = 0)
|> printList

// Same thing, using a list expression
[ for i in 1..10 do
    let r = fib i
    if r % 2 = 0 then yield r ]
|> printList

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

// Open the Windows Forms library
open System.Windows.Forms

// Create a window and set a few properties
let form = new Form(Visible=true, TopMost=true, Text="Welcome to F#")

// Create a label to show some text in the form
let label =
    let x = 3 + (4 * 5)
    new Label(Text = $"{x}")

// Add the label to the form
form.Controls.Add(label)

// Finally, run the form
[<System.STAThread>]
Application.Run(form)

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

/// A simple prime number detector
let isPrime (n:int) =
   let bound = int (sqrt (float n))
   seq {2 .. bound} |> Seq.forall (fun x -> n % x <> 0)

// We are using async workflows
let primeAsync n =
    async { return (n, isPrime n) }

/// Return primes between m and n using multiple threads
let primes m n =
    seq {m .. n}
        |> Seq.map primeAsync
        |> Async.Parallel
        |> Async.RunSynchronously
        |> Array.filter snd
        |> Array.map fst

// Run a test
primes 1000000 1002000
    |> Array.iter (printfn "%d")

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ «Лицензия F# Software Foundation» . Гитхаб . 14 октября 2021 г.
  2. ^ «Лицензия Microsoft F#» . Гитхаб . 16 октября 2021 г.
  3. ^ Jump up to: а б Сайм, Гранич и Чистернино (2007 :2)
  4. ^ Jump up to: а б с д и «Исторические признания F #» . Майкрософт .
  5. ^ Jump up to: а б Сайм, Дон (2006). «Использование компонентов метапрограммирования .NET из F #» . [F#] основан на дизайне Core ML и, в частности, имеет основной язык, в значительной степени совместимый с языком OCaml.
  6. ^ для асинхронности
  7. ^ Jump up to: а б с д и ж г час я дж к л Фонд программного обеспечения F#. «Использование F# для веб-приложений» . Проверено 30 июля 2020 г.
  8. ^ Jump up to: а б с д и ж г час я дж к л м Фонд программного обеспечения F#. «Использование F# для программирования графического процессора» . Архивировано из оригинала 25 декабря 2019 г. Проверено 25 декабря 2019 г.
  9. ^ Jump up to: а б с Фонд программного обеспечения F#. «Фонд программного обеспечения F#» . Проверено 24 ноября 2012 г.
  10. ^ Jump up to: а б Фонд программного обеспечения F#. «Компилятор F# (версия с открытым исходным кодом) @ github» . Проверено 24 ноября 2012 г.
  11. ^ «Разработка с помощью Visual F# в Visual Studio» . Проверено 30 июля 2020 г.
  12. ^ «Ф#» . Проверено 30 июля 2020 г.
  13. ^ Сайм, Дон. «Выпущен F# 1.0.8» . Майкрософт . Проверено 7 сентября 2014 г.
  14. ^ Сайм, Дон. «F# 2.0 выпущен как часть Visual Studio 2010» . Майкрософт . Проверено 7 сентября 2014 г.
  15. ^ Зандер, Джейсон. «Visual Studio 2012 и .NET Framework 4.5 выпущены в Интернете» . Майкрософт . Проверено 7 сентября 2014 г.
  16. ^ «Visual Studio 2013 выпущена для Интернета» . Майкрософт . Проверено 7 сентября 2014 г.
  17. ^ «Анонс окончательной первоначальной версии Visual F# 4.0» . Майкрософт . Проверено 15 сентября 2015 г.
  18. ^ «Анонс F# 4.1 и инструментов Visual F# для Visual Studio 2017» . Проверено 8 марта 2017 г.
  19. ^ «Анонсируем F# 4.5» . Майкрософт. 14 августа 2018 года . Проверено 14 августа 2018 г.
  20. ^ «FSharp.Core 4.5.0» .
  21. ^ «Загрузить .NET Core 2.1 (Linux, macOS и Windows)» . Майкрософт . Проверено 13 мая 2021 г.
  22. ^ «Анонсируем F# 4.6» . Майкрософт. 29 марта 2019 года . Проверено 29 марта 2019 г.
  23. ^ «FSharp.Core 4.6.0» .
  24. ^ «Загрузить .NET Core 2.2 (Linux, macOS и Windows)» . Майкрософт . Проверено 13 мая 2021 г.
  25. ^ «Анонсируем F# 4.7» . Майкрософт. 23 сентября 2019 г. Проверено 23 сентября 2019 г.
  26. ^ «FSharp.Core 4.7.0» .
  27. ^ «Загрузить .NET Core 3.0 (Linux, macOS и Windows)» . Майкрософт . Проверено 13 мая 2021 г.
  28. ^ Jump up to: а б «Анонсируем F#5» . 10 ноября 2020 г.
  29. ^ «Загрузить .NET 5.0 (Linux, macOS и Windows)» . Майкрософт . Проверено 13 мая 2021 г.
  30. ^ «F#6 официально здесь!» . 9 ноября 2021 г.
  31. ^ «Загрузить .NET 6.0 (Linux, macOS и Windows)» . Майкрософт . Проверено 14 ноября 2021 г.
  32. ^ «Анонсируем F#7» . 8 ноября 2022 г.
  33. ^ «Загрузить .NET 7.0 (Linux, macOS и Windows)» . Майкрософт . Проверено 8 ноября 2022 г.
  34. ^ «Анонсируем F#8» . 14 ноября 2023 г.
  35. ^ «Загрузить .NET 8.0 (Linux, macOS и Windows)» . Майкрософт . Проверено 14 ноября 2023 г.
  36. ^ Эдвардс, Кэтрин (23 декабря 2008 г.). «А-Я языков программирования: F#» . Сетевой мир . ИДГ. Архивировано из оригинала 13 ноября 2018 года . Проверено 8 августа 2016 г.
  37. ^ Макнамара, Брайан. «Подробнее о возможностях языка F# 3.0» . Майкрософт . Проверено 7 сентября 2014 г.
  38. ^ Макнамара, Брайан. «Анонсируем предварительный выпуск F# 3.1» . Майкрософт . Проверено 7 сентября 2014 г.
  39. ^ «Анонс окончательной первоначальной версии Visual F# 4.0» . Проверено 8 марта 2017 г.
  40. ^ «Анонс F# 4.1 и инструментов Visual F# для Visual Studio 2017» . Проверено 8 марта 2017 г.
  41. ^ «Анонсируем F# 4.7» . 23 сентября 2019 г.
  42. ^ «Анонсируем F#5» . 10 ноября 2020 г.
  43. ^ «Что нового в F#6 — Руководство по F#» . 10 марта 2023 г.
  44. ^ «Анонсируем F#7» . 8 ноября 2022 г.
  45. ^ «Анонсируем F#8» . 14 ноября 2023 г.
  46. ^ «Упрощение вычислений F# с помощью нового оператора while!» ключевое слово' " . 20 сентября 2023 г.
  47. ^ «Программирование/вычислительные выражения F Sharp — Wikibooks, открытые книги для открытого мира» . ru.wikibooks.org . Проверено 21 января 2022 г.
  48. ^ кексугит (8 июля 2011 г.). «Хвостовые вызовы в F#» . docs.microsoft.com . Проверено 22 апреля 2022 г.
  49. ^ Jump up to: а б с д и ж г час «Обзор языка F #» (PDF) . Проверено 14 декабря 2007 г.
  50. ^ Jump up to: а б «Некоторые подробности о вычислительных выражениях F#» . Проверено 14 декабря 2007 г.
  51. ^ Jump up to: а б «Сопоставление с образцом в F#, часть 2: Активные шаблоны» . Архивировано из оригинала 9 декабря 2012 г. Проверено 24 ноября 2012 г.
  52. ^ Jump up to: а б с «Знакомство с асинхронными рабочими процессами F#» . Проверено 14 декабря 2007 г.
  53. ^ «Выражения задач» . 19 апреля 2022 г. Проверено 15 января 2023 г.
  54. ^ «Единицы измерения (F#)» . Проверено 24 ноября 2012 г.
  55. ^ «Расширить единицы измерения, включив в них больше числовых типов» . Гитхаб .
  56. ^ «Единицы измерения в F#: Часть первая, Знакомство с единицами измерения» . Проверено 24 ноября 2012 г.
  57. ^ «Кодовые котировки (F#)» . Проверено 24 ноября 2012 г.
  58. ^ «Поставщики типов» . Проверено 24 ноября 2012 г.
  59. ^ «Новый технический отчет от Microsoft Research: поддержка строго типизированного языка для источников информации в масштабе Интернета» . Проверено 24 ноября 2012 г.
  60. ^ «Выражения запроса (F#)» . Проверено 24 ноября 2012 г.
  61. ^ «F # 3.0 — Поставщики типов LINQ + = информационно насыщенное программирование» . Проверено 24 ноября 2012 г.
  62. ^ Александр Куракин (15 марта 2019 г.). «Rider 2019.1 запускает программу раннего доступа!» .
  63. ^ «Используйте F# в Windows» . Фонд программного обеспечения F# . Проверено 7 августа 2018 г.
  64. ^ «Особенности – Райдер» . ДжетБрэйнс . Проверено 7 августа 2018 г.
  65. ^ «Fable: JavaScript, которым можно гордиться!» . басня.io . Проверено 9 декабря 2017 г.
  66. ^ Интеллектуальная фабрика. «Домашняя страница WebSharper» . Проверено 24 ноября 2012 г.
  67. ^ «Примеры использования Microsoft: Microsoft Visual Studio 2012 — фирма, оказывающая финансовые услуги» . Майкрософт . Проверено 25 ноября 2012 г.
  68. ^ «F# для торговли энергией и оптимизации портфеля» . Проверено 25 ноября 2012 г.
  69. ^ «Пример Microsoft: страхование Grange» . Майкрософт . Проверено 25 ноября 2012 г.
  70. ^ Трелфорд, Фил (2007). «Обучение с F#» . Материалы 4-го семинара ACM SIGPLAN по коммерческим пользователям функционального программирования - CUFP '07 . стр. 1–2. дои : 10.1145/1362702.1362709 . ISBN  9781450378444 . S2CID   24018363 . Проверено 25 ноября 2012 г.
  71. ^ «Работа F# в социальных играх на Facebook» . Проверено 25 ноября 2012 г.
  72. ^ «Отзывы разработчиков F#» . Проверено 25 мая 2021 г.
  73. ^ «Написание сценариев на F#» . 12 сентября 2008 года . Проверено 17 января 2020 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: fbaa0c1418952d11dc17c0042c7e3e4b__1721377080
URL1:https://arc.ask3.ru/arc/aa/fb/4b/fbaa0c1418952d11dc17c0042c7e3e4b.html
Заголовок, (Title) документа по адресу, URL1:
F Sharp (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)