F ostry (język programowania)

F#
F Sharp logo.svg
Znak logo F#
Paradygmat Wieloparadygmat : funkcjonalny , imperatywny , obiektowy , agentowy , metaprogramowanie , refleksyjny , współbieżny
Rodzina ML
Zaprojektowany przez Don Syme , Microsoft Research
Deweloper Microsoft , Fundacja oprogramowania F#
Po raz pierwszy pojawiły się 2005 ; 18 lat temu ( 2005 ) , wersja 1.0
Wersja stabilna
Edit this on Wikidata 7.0 / 8 listopada 2022 ; 3 miesiące temu ( 8 listopada 2022 )
Dyscyplina pisania Statyczny , silny , wywnioskowany
system operacyjny Wieloplatformowość : .NET , .NET Framework , Mono
Licencja Licencja MIT
Rozszerzenia nazw plików .fs, .fsi, .fsx, .fsscript
Strona internetowa fsharp .org
Pod wpływem
C# , Erlang , Haskell , ML , OCaml , Python , Scala
Pod wpływem
C # , Elm , F * , LiveScript

F# ( wymawiane jako Fis ) to przede wszystkim funkcjonalny, wieloparadygmatowy język programowania ogólnego przeznaczenia o silnie typowanych typach , który obejmuje funkcjonalne , imperatywne i obiektowe metody programowania. Jest najczęściej używany jako międzyplatformowy Common Language Infrastructure (CLI) w .NET , ale może również generować kod JavaScript i procesora graficznego (GPU).

F# jest rozwijany przez F# Software Foundation , Microsoft i otwartych współpracowników. Wieloplatformowy kompilator open source dla języka F# jest dostępny w F# Software Foundation . F# to w pełni obsługiwany język w programach Visual Studio i JetBrains Rider . Wtyczki obsługujące F# istnieją dla wielu powszechnie używanych edytorów, w tym Visual Studio Code , Vim i Emacs .

F# jest członkiem rodziny języków ML i powstał jako implementacja .NET Framework rdzenia języka programowania OCaml . Wpływ na to miały również C# , Python , Haskell , Scala i Erlang .

Historia

Wersje

Wersja Specyfikacja języka Data Platformy Czas działania
F# 1.x maj 2005 Okna .NET 1.0 - 3.5
F# 2.0 sierpień 2010 kwiecień 2010 Linuks , macOS , Windows .NET 2.0 - 4.0, mono
F# 3.0 listopad 2012 sierpień 2012
Linux , macOS , Windows ; JavaScript , GPU
.NET 2.0 - 4.5, mono
F# 3.1 listopad 2013 Październik 2013
Linux , macOS , Windows ; JavaScript , GPU
.NET 2.0 - 4.5, mono
F# 4.0 styczeń 2016 r lipiec 2015 r
F# 4.1 maj 2018 r marzec 2017 r Linuks , macOS , Windows ,

JavaScript , GPU

.NET 3.5 - 4.6.2, .NET Core , mono
F# 4.5 sierpień 2018 r Linuks , macOS , Windows ,

JavaScript , GPU

.NET 4.5 - 4.7.2, .NET Core SDK 2.1.400
F# 4.6 marzec 2019 r Linuks , macOS , Windows ,

JavaScript , GPU

.NET 4.5 - 4.7.2, .NET Core SDK 2.2.300
F# 4.7 wrzesień 2019 r Linuks , macOS , Windows ,

JavaScript , GPU

.NET 4.5 - 4.8, .NET Core SDK 3.0.100
F# 5.0 listopad 2020 r Linuks , macOS , Windows ,

JavaScript , GPU

.NET SDK 5.0.100
F# 6.0 listopad 2021 r Linuks , macOS , Windows ,

JavaScript , GPU

.NET SDK 6.0.100
F# 7.0 listopad 2022 r Linuks , macOS , Windows ,

JavaScript , GPU

.NET SDK 7.0.100

Ewolucja języka

F# wykorzystuje otwarty proces programowania i inżynierii. Procesem ewolucji języka zarządza Don Syme z Microsoft Research jako życzliwy dyktator na całe życie (BDFL) w zakresie projektowania języka, wraz z F# Software Foundation. Wcześniejsze wersje języka F# zostały zaprojektowane przez firmy Microsoft i Microsoft Research przy użyciu zamkniętego procesu programistycznego.

Język F# został po raz pierwszy uwzględniony w programie Visual Studio w wydaniu 2010 , na tym samym poziomie co Visual Basic i C# (choć jako opcja), i pozostał w kolejnych wydaniach, dzięki czemu język ten jest szeroko dostępny i dobrze obsługiwany.

F# pochodzi z Microsoft Research , Cambridge, Wielka Brytania. Język został pierwotnie zaprojektowany i zaimplementowany przez Dona Syme , według którego w zespole fsharp mówi się, że F oznacza „Zabawa”. Andrew Kennedy przyczynił się do zaprojektowania jednostek miary . Narzędzia Visual F# Tools for Visual Studio zostały opracowane przez firmę Microsoft. F# Software Foundation opracowała kompilator i narzędzia języka F# typu open source, obejmujące implementację kompilatora typu open source dostarczoną przez zespół Microsoft Visual F# Tools.

Podsumowanie wersji
Dodano funkcje
F# 1.0
  • Programowanie funkcjonalne
  • Związki dyskryminowane
  • Dokumentacja
  • Krotki
  • Dopasowanie wzorca
  • Wpisz skróty
  • Programowanie obiektowe
  • Struktury
  • Pliki podpisu
  • Pliki skryptów
  • Programowanie imperatywne
  • Moduły (bez funktorów)
  • Moduły zagnieżdżone
  • Interoperacyjność .NET
F# 2.0
  • Aktywne wzory
  • Jednostki miary
  • Wyrażenia sekwencyjne
  • Programowanie asynchroniczne
  • Programowanie agentów
  • Członkowie rozszerzenia
  • Nazwane argumenty
  • Argumenty opcjonalne
  • Krojenie tablicy
  • Cytaty
  • Natywna interoperacyjność
  • Wyrażenia obliczeniowe
F# 3.0
  • Wpisz dostawców
  • Wyrażenia zapytania LINQ
  • CLIMutable atrybut
  • Ciągi w potrójnym cudzysłowie
  • Auto-właściwości
  • Podane jednostki miary
F# 3.1
  • Nazwane pola typu unii
  • Rozszerzenia do krojenia tablic
  • Udoskonalenia wnioskowania o typach
F# 4.0
  • Printf na wartościach jednostkowych
  • Inicjatory właściwości rozszerzenia
  • Podane typy inne niż null
  • Konstruktory podstawowe jako funkcje
  • Parametry statyczne dla dostarczonych metod
  • Interpolacja printf
  • Rozszerzona gramatyka #if
  • Atrybut rozmowy telefonicznej
  • Wiele instancji interfejsu
  • Argumenty typu opcjonalnego
  • Słowniki parametrów
F# 4.1
  • Krotki struktur, które współdziałają z krotkami języka C#
  • Adnotacje strukturalne dla rekordów
  • Adnotacje strukturalne dla dyskryminowanych związków pojedynczych przypadków
  • Podkreślenia w literałach numerycznych
  • Atrybuty argumentu informacji o dzwoniącym
  • Typ wyniku i niektóre podstawowe funkcje wyniku
  • Wzajemnie referencyjne typy i moduły w tym samym pliku
  • Niejawna składnia „modułu” w modułach z wspólną nazwą jako typem
  • Byref zwraca, obsługując metody C# zwracające ref
  • Ulepszenia komunikatów o błędach
  • Wsparcie dla „stałego”
F# 4.5
  • Dopasowanie wersji pliku binarnego, pakietu i języka
  • Wsparcie dla „Span ' i typy pokrewne
  • Możliwość generowania zwrotów „byref”.
  • Typ „voidptr”.
  • Typy „inref<'T>” i „outref<'T>” reprezentujące tylko do odczytu i tylko do zapisu „byref”
  • Struktury „IsByRefLike”.
  • Struktury „IsReadOnly”.
  • Obsługa metody rozszerzenia dla „byref<'T>”/'inref<'T>'/'outref<'T>'
  • 'mecz!' słowo kluczowe w wyrażeniach obliczeniowych
  • Zrelaksowany upcast z „wydajnością” w wyrażeniach F# seq/list/array
  • Zrelaksowane wcięcia z wyrażeniami listowymi i tablicowymi
  • Przypadki wyliczenia emitowane jako publiczne
F# 4.6
  • Typy anonimowe
F# 4.7
  • Niejawne plony
  • Nigdy więcej wymaganego podwójnego podkreślenia
  • Relaksacje wcięć dla parametrów przekazywanych do konstruktorów i metod statycznych
  • funkcja „nazwa”.
  • Otwarte klasy statyczne
F# 5.0
  • FSharp.Core jest teraz ukierunkowany tylko na standard sieciowy 2.0
  • Odwołania do pakietów w skryptach języka F#
  • Obsługa notebooków Jupyter, nteract i VSCode
  • Interpolacja łańcuchów
  • Wsparcie dla nameof
  • Deklaracje typu otwartego
  • Ulepszone krojenie
  • Ulepszenia cytatów w języku F#
  • Aplikacyjne wyrażenia obliczeniowe
  • Ulepszone śledzenie stosu w asynchronicznym języku F# i innych wyrażeniach obliczeniowych
  • Ulepszona współpraca z platformą .NET
  • Poprawiona wydajność map i zestawów w FSharp.Core
  • Poprawiona wydajność kompilatora
  • Ulepszona analiza kompilatora dla autorów bibliotek
F# 6.0
  • Zadania
  • Prostsze indeksowanie
  • Rozszerzenia do „aktywnych wzorców”
  • Przeciążone operacje niestandardowe w wyrażeniach obliczeniowych
  • „jako” wzorce
  • Wersje składni wcięć
  • Dodatkowe niejawne konwersje
  • Dodatkowe niejawne konwersje upcast
  • Niejawne konwersje liczb całkowitych
  • Pierwszorzędna obsługa niejawnych konwersji w stylu platformy .NET
  • Opcjonalne ostrzeżenia dotyczące niejawnych konwersji
  • Formatowanie liczb binarnych
  • Odrzuca przy użyciu powiązań
  • Dyrektywa optymalizatora InlineIfLambda
  • Kod do wznowienia
  • Dodatkowe funkcje zbierania
  • Mapa ma klucze i wartości
  • Dodatkowe elementy wewnętrzne dla NativePtr
  • Dodatkowe typy liczbowe z adnotacjami jednostek
  • Ostrzeżenia informacyjne dla rzadko używanych operatorów symbolicznych
F# 7.0
  • Obsługa statycznych elementów abstrakcyjnych w interfejsach
  • Ułatwienie pracy z parametrami SRTP (statycznie rozpoznawane parametry typu).
  • Wymagane sprawdzenie właściwości
  • Zakres init i właściwości tylko init
  • Obsługa zestawów referencyjnych
  • Samodzielne wdrożenia języka F# i natywne AOT
  • Dodano obsługę tablic Nd do rangi 32.
  • Parzystość funkcji modułu wynikowego z opcją.
  • Poprawki w generowaniu kodu maszyn wznawialnych dla kompilacji zadań.
  • Lepsze generowanie kodu dla generowanych przez kompilator modułów pobierających właściwości bez efektów ubocznych
  • Kompilator specyficzny dla platformy ARM64 i obsługa obiektów docelowych ARM64 w kompilatorze języka F#. Obsługa buforowania #r menedżera zależności
  • Równoległe sprawdzanie typów i sprawdzanie projektów (eksperymentalne, można włączyć za pomocą ustawień VS lub przez autorów narzędzi)
  • Różne poprawki błędów i ulepszenia.

Przegląd języków

Programowanie funkcjonalne

Obsługując funkcje obiektowe dostępne w języku C#, F# jest silnie wpisanym językiem funkcjonalnym z dużą liczbą możliwości, które zwykle można znaleźć tylko w funkcjonalnych językach programowania. Wszystkie te funkcje umożliwiają pisanie programów w języku F# w całkowicie funkcjonalnym stylu, a także umożliwiają mieszanie stylów funkcjonalnych i obiektowych.

Przykładowe cechy funkcjonalne to:

F# jest językiem opartym na wyrażeniach, który wykorzystuje szybką ocenę , a także w niektórych przypadkach leniwą ocenę . Każda instrukcja w języku F#, w tym wyrażenia if , wyrażenia try i pętle, jest wyrażeniem, które można komponować, z typem statycznym. Funkcje i wyrażenia, które nie zwracają żadnej wartości, zwracają typ jednostki . F# używa let słowa kluczowego do powiązania wartości z nazwą. Na przykład:

      niech  x  =  3  +  4 

wiąże wartość 7 z nazwą x .

Nowe typy są definiowane za pomocą słowa kluczowego type . W przypadku programowania funkcjonalnego język F# zapewnia Tuple , Record , Discriminated Union , list , option i typy wyników . Krotka reprezentuje zbiór n wartości, gdzie n ≥ 0. Wartość n nazywana jest liczbą krotek. Krotka 3 byłaby reprezentowana jako (A, B, C) , gdzie A, B i C są wartościami prawdopodobnie różnych typów. Krotki można używać do przechowywania wartości tylko wtedy, gdy liczba wartości jest znana w czasie projektowania i pozostaje stała podczas wykonywania.

Rekord jest typem, w którym elementy danych są nazwane . Oto przykład definicji rekordu:

    
            
             wpisz  R  =  {  Imię  :  string  Wiek  :  int  } 

Rekordy mogą być tworzone jako let r = { Name = "AB" ; Wiek = 42 }. Słowo with jest używane do tworzenia kopii rekordu, jak w przypadku { r with Name = "CD" }, który tworzy nowy rekord poprzez skopiowanie r i zmianę wartości pola Nazwa (zakładając rekord utworzony w ostatnim przykładzie został nazwany R ).

Typ unii dyskryminowanej to bezpieczna dla typu wersja unii C. Na przykład,

    
       
        wpisz  A  =  |  UnionCaseX  ciągu  znaków  |  UnionCaseY  z  int 

Wartości typu unii mogą odpowiadać dowolnemu przypadkowi unii. Rodzaje wartości przenoszonych przez każdy przypadek sumy są zawarte w definicji każdego przypadku.

Typ listy to niezmienna lista połączona reprezentowana za pomocą notacji head :: tail ( :: jest operatorem cons ) lub skrótu jako [ item1 ; przedmiot2 ; element3 ] . Pusta lista jest zapisywana [] . Typ opcji jest dyskryminowanym typem unii z opcjami Some(x ) lub None . Typy F# mogą być generyczne , zaimplementowane jako generyczne typy .NET.

F# obsługuje funkcje i domknięcia lambda . Wszystkie funkcje w języku F# są wartościami pierwszej klasy i są niezmienne. Funkcje mogą być curry . Będąc wartościami pierwszej klasy, funkcje mogą być przekazywane jako argumenty do innych funkcji. Podobnie jak inne funkcjonalne języki programowania, język F# umożliwia komponowanie funkcji (informatyka) przy użyciu operatorów >> i << .

Język F# udostępnia wyrażenia sekwencji , które definiują sekwencję seq { ... } , list [ ... ] lub array [| ... |] poprzez kod generujący wartości. Na przykład,

      0   
               
                  seq  {  dla  b  w  ..  25  zrób,  jeśli  b  <  15  , to  daj  b  *  b  } 

tworzy ciąg kwadratów liczb od 0 do 14 poprzez odfiltrowanie liczb z zakresu od 0 do 25. Sekwencje są generatorami – wartości są generowane na żądanie (tzn. są oceniane leniwie ) – podczas gdy listy i tablice są oceniane chętnie .

F# używa dopasowywania wzorców do wiązania wartości z nazwami. Dopasowywanie wzorców jest również używane podczas uzyskiwania dostępu do unii dyskryminowanych — unia jest dopasowywana pod względem wartości do reguł wzorców, a reguła jest wybierana, gdy dopasowanie powiedzie się. Język F# obsługuje również aktywne wzorce jako formę rozszerzalnego dopasowywania wzorców. Jest używany na przykład, gdy istnieje wiele sposobów dopasowywania typu.

Język F# obsługuje ogólną składnię służącą do definiowania obliczeń kompozycyjnych zwanych wyrażeniami obliczeniowymi . Szczególnymi rodzajami wyrażeń obliczeniowych są wyrażenia sekwencyjne, obliczenia asynchroniczne i zapytania. Wyrażenia obliczeniowe są implementacją monady .

Programowanie imperatywne

Obsługa języka F# dla programowania imperatywnego obejmuje

Wartości i pola rekordów mogą być również oznaczone jako mutable . Na przykład:


    

   // Zdefiniuj „x” z wartością początkową „1”  niech  mutable  x  =  1  // Zmień wartość „x” na „3”  x  <-  3 

Ponadto język F# obsługuje dostęp do wszystkich typów i obiektów interfejsu wiersza polecenia, takich jak te zdefiniowane w przestrzeni nazw System.Collections.Generic definiującej imperatywne struktury danych.

Programowanie obiektowe

Podobnie jak inne języki Common Language Infrastructure (CLI), F# może używać typów CLI poprzez programowanie obiektowe. Obsługa języka F# dla programowania obiektowego w wyrażeniach obejmuje:

  • Notacja kropkowa, np. x . Nazwa
  • Wyrażenia obiektowe, np. { new obj () z elementem x . ToString () = "cześć" }
  • Konstrukcja obiektu, np. new Form ()
  • Testy typu, np. x :? strunowy
  • Koercje typu, np. x :?> string
  • Nazwane argumenty, np. x . Metoda ( someArgument = 1 )
  • Nazwane ustawiacze, np. new Form ( Text = "Hello" )
  • Argumenty opcjonalne, np. x . Metoda ( Argument Opcjonalny = 1 )

Obsługa programowania obiektowego we wzorcach obejmuje

  • Testy typu, np. :? ciąg jak s
  • Aktywne wzorce, które można zdefiniować w typach obiektów

Definicje typów obiektów języka F# mogą być klasami, strukturami, interfejsami, wyliczeniami lub definicjami typów delegatów, odpowiadającymi formularzom definicji znalezionym w języku C# . Na przykład tutaj jest klasa z konstruktorem przyjmującym nazwę i wiek oraz deklarującym dwie właściwości.


       
       
        /// Prosta definicja typu obiektu  typu  Person  (  name  :  string  ,  age  :  int  )  =  Member  x  .  Imię  =  nazwa  członka  x  .  Wiek  =  wiek 

Programowanie asynchroniczne

Język F# obsługuje programowanie asynchroniczne za pomocą asynchronicznych przepływów pracy . Asynchroniczny przepływ pracy jest zdefiniowany jako sekwencja poleceń wewnątrz async{ ... } , jak w

   
         
               
               
                
               niech  asynctask  =  async  {  niech  req  =  WebRequest  .  Utwórz  (  url  )  pozwól!  odpowiedź  =  żądanie  .  GetResponseAsync  ()  użyj  stream  =  response  .  GetResponseStream  ()  użyj  streamreader  =  new  System  .  IO  .  StreamReader  (  stream  )  zwraca  streamreader  .  Czytaj do końca  ()  } 

niech ! wskazuje, że wyrażenie po prawej stronie (pobieranie odpowiedzi) powinno być wykonywane asynchronicznie, ale przepływ powinien być kontynuowany tylko wtedy, gdy wynik jest dostępny. Innymi słowy, z punktu widzenia bloku kodu otrzymanie odpowiedzi jest wywołaniem blokującym, podczas gdy z punktu widzenia systemu wątek nie zostanie zablokowany i może być wykorzystany do przetwarzania innych przepływów podczas gdy wynik potrzebny do tego nie staje się dostępny.

Blok asynchroniczny można wywołać za pomocą funkcji Async.RunSynchronously . Wiele bloków asynchronicznych można wykonywać równolegle za pomocą Async.Parallel , która pobiera listę obiektów asynchronicznych (w przykładzie asynctask jest obiektem asynchronicznym) i tworzy inny obiekt asynchroniczny do równoległego uruchamiania zadań z list. Wynikowy obiekt jest wywoływany przy użyciu Async.RunSynchronously . Odwrócenie kontroli w języku F# jest zgodne z tym wzorcem.

Programowanie równoległe

Programowanie równoległe jest obsługiwane częściowo przez Async.Parallel , Async.Start i inne operacje, które równolegle uruchamiają bloki asynchroniczne.

Programowanie równoległe jest również obsługiwane przez operatory programowania funkcyjnego Array.Parallel w standardowej bibliotece języka F#, bezpośrednie użycie modelu programowania zadań System.Threading.Tasks , bezpośrednie użycie puli wątków platformy .NET i wątków platformy .NET oraz dynamiczne tłumaczenie języka F# kod do alternatywnych silników wykonywania równoległego, takich jak kod GPU .

Jednostki miary

System typu F# obsługuje sprawdzanie jednostek miary dla liczb. Funkcja jednostek miary integruje się z wnioskowaniem typu F#, aby wymagać minimalnych adnotacji typu w kodzie użytkownika.

Metaprogramowanie

Język F# umożliwia niektórym formom dostosowywania składni za pomocą metaprogramowania w celu obsługi osadzania niestandardowych języków specyficznych dla domeny w języku F#, w szczególności za pomocą wyrażeń obliczeniowych.

Język F# zawiera funkcję metaprogramowania w czasie wykonywania zwaną cytatami. Wyrażenie cudzysłowu daje w wyniku abstrakcyjną reprezentację drzewa składni wyrażeń języka F#. Podobnie, definicje oznaczone atrybutem [<ReflectDefinition>] są również dostępne w formie cytatów. Cytaty w języku F# są używane do różnych celów, w tym do kompilowania kodu F# do JavaScript i GPU . (Cytaty reprezentują ich wyrażenia w kodzie F# jako dane do użycia przez inne części programu, wymagając jednocześnie, aby był to poprawny pod względem składni kod F#).

Programowanie bogate w informacje

W języku F# 3.0 wprowadzono formę metaprogramowania w czasie kompilacji poprzez statycznie rozszerzalne generowanie typów zwanych dostawcami typów F#. Dostawcy typów języka F# umożliwiają rozszerzenie kompilatora i narzędzi języka F# o składniki, które dostarczają informacje o typie kompilatorowi na żądanie w czasie kompilacji. Dostawcy typu F# byli wykorzystywani do zapewniania silnie wpisanego dostępu do połączonych źródeł informacji w skalowalny sposób, w tym do grafu wiedzy Freebase .

W języku F# 3.0 funkcje cytatów i wyrażeń obliczeniowych w języku F# są połączone w celu zaimplementowania zapytań LINQ . Na przykład:


 

   
   


         
                      // Użyj dostawcy typu OData, aby utworzyć typy, których można użyć w celu uzyskania dostępu do bazy danych Northwind.  otwórz  Microsoft.FSharp.Data.TypeProviders  wpisz  Northwind  =  ODataService  <  "http://services.odata.org/Northwind/Northwind.svc"  >  niech  db  =  Northwind  .  GetDataContext  ()  // Wyrażenie zapytania.  niech  zapytanie1  =  zapytanie  {  dla  klienta  w  db  .  Klienci  wybierają  klienta  }  _   

Kombinacja dostawców typów, zapytań i programowania funkcyjnego o silnym typie jest znana jako programowanie bogate w informacje .

Programowanie agentów

Język F# obsługuje odmianę modelu programowania aktorów za pomocą implementacji w pamięci lekkich agentów asynchronicznych. Na przykład poniższy kod definiuje agenta i wysyła 2 komunikaty:

  
      
            
                 
                       
                      
         0 niech  licznik  =  MailboxProcessor  .  Start  (  zabawna  skrzynka odbiorcza  ->  niech  rec  loop  n  =  async  {  do  printfn  "n = %d, wait..."  n  let!  msg  =  inbox  .  Receive  ()  return  !  loop  (  n  +  msg  )  }  loop  ) 

Narzędzia programistyczne

  • Visual Studio z zainstalowanymi narzędziami Visual F# firmy Microsoft może służyć do tworzenia, uruchamiania i debugowania projektów F#. Narzędzia Visual F# obejmują read-eval-print loop ) obsługiwaną przez program Visual Studio, która może wykonywać kod F# w miarę jego zapisywania. Visual Studio dla komputerów Mac również w pełni obsługuje projekty F#.
  • Visual Studio Code zawiera pełną obsługę języka F# za pośrednictwem rozszerzenia Ionide .
  • Język F# można opracować za pomocą dowolnego edytora tekstu. Specyficzne wsparcie istnieje w edytorach takich jak Emacs .
  • JetBrains Rider jest zoptymalizowany pod kątem opracowywania kodu F# począwszy od wersji 2019.1.
  • LINQPad obsługuje język F# od wersji 2.x. [ czyj? ]

Obszary zastosowania

F# to język programowania ogólnego przeznaczenia .

Programowanie sieciowe

SAFE Stack to kompleksowy stos języka F# do tworzenia aplikacji internetowych. Wykorzystuje ASP.NET Core po stronie serwera i Fable po stronie klienta.

Alternatywną, kompleksową opcją języka F# jest platforma WebSharper .

Tworzenie aplikacji wieloplatformowych

Języka F# można używać razem z narzędziami Visual Studio Tools for Xamarin do tworzenia aplikacji dla systemów iOS i Android . Biblioteka Fabulous zapewnia wygodniejszy interfejs funkcjonalny.

Programowanie analityczne

F# jest używany między innymi do ilościowego programowania finansów, handlu energią i optymalizacji portfela, uczenia maszynowego, analizy biznesowej i gier społecznościowych na Facebooku .

W 2010 roku język F# został umieszczony jako zoptymalizowana alternatywa dla języka C# . Zdolność F# do tworzenia skryptów i zgodność międzyjęzykowa ze wszystkimi produktami firmy Microsoft sprawiły, że stał się popularny wśród programistów.

Skrypty

F# może być używany jako język skryptowy, głównie do wykonywania skryptów pętli odczytu-ewalu-wydruku (REPL).

Społeczność open-source

open source F# obejmuje F# Software Foundation i F# Open Source Group w GitHub . Popularne projekty F# typu open source obejmują:

  • Fable , transpilator F# do Javascript oparty na Babel .
  • Paket , alternatywny menedżer pakietów dla platformy .NET, który nadal może korzystać z repozytoriów NuGet , ale ma scentralizowane zarządzanie wersjami.
  • FAKE , system kompilacji przyjazny dla języka F#.
  • Giraffe , funkcjonalnie zorientowane oprogramowanie pośrednie dla ASP.NET Core .
  • Suave , lekki serwer WWW i biblioteka do tworzenia stron internetowych.

Zgodność

F # zawiera starszy „tryb zgodności ML”, który może bezpośrednio kompilować programy napisane z grubsza w dużym podzbiorze OCaml, bez funktorów, obiektów, wariantów polimorficznych ani innych dodatków.

Przykłady

Oto kilka małych próbek:


  // To jest komentarz do przykładowego programu hello world.  printfn  „Witaj, świecie!” 

Klasa Person z konstruktorem przyjmującym nazwę i wiek oraz dwie niezmienne właściwości.


       
       
       
    

     /// To jest komentarz do dokumentacji dla definicji typu.  wpisz  Osoba  (  imię  :  ciąg  ,  wiek  :  int  )  =  członek  x  .  Imię  =  nazwa  członka  x  .  Age  =  age  /// instancja klasy  niech  mrSmith  =  Person  (  "Smith"  ,  42  ) 

Prostym przykładem często używanym do zademonstrowania składni języków funkcjonalnych jest funkcja silnia dla nieujemnych 32-bitowych liczb całkowitych, tutaj pokazana w języku F#:


    
      
     0  
            


     
     0   
            
    

         /// Używając wyrażenia dopasowującego wzorce,  niech  rec  factorial  n  =  dopasuj  n  z  |  ->  1  |  _  ->  n  *  silnia  (  n  -  1  )  /// Dla funkcji jednoargumentowych istnieje cukier syntaktyczny (funkcja dopasowująca wzorce):  niech  rec  silnia  =  function  |  ->  1  |  n  ->  n  *  silnia  (  n  -  1  )  /// Używając operatora składania i zakresu  niech  silnia  n  =  [  1  ..  n  ]  |>  Seq  .  złożyć  (*)  1 

Przykłady iteracji:


    
        
          


    
       


    
      
       
        
          
          /// Iteracja z wykorzystaniem pętli 'for'  let  printList  lst  =  for  x  in  lst  do  printfn  "%d"  x  /// Iteracja z użyciem funkcji wyższego rzędu  let  printList2  lst  =  List  .  iter  (  printfn  "%d"  )  lst  /// Iteracja przy użyciu funkcji rekurencyjnej i dopasowywania wzorców  let  rec  printList3  lst  =  dopasuj  lst  do  |  []  ->  ()  |  h  ::  t  ->  printfn  "%d"  h  printList3  t 

Przykłady Fibonacciego:


   
          
          
         0  
           
                  
      0 


          0


  
      
          0
 


     
        
         0    
  /// Formuła liczbowa Fibonacciego  let  fib  n  =  niech  rec  g  n  f0  f1  =  dopasuj  n  do  |  ->  f0  |  1  ->  f1  |  _  ->  g  (  n  -  1  )  f1  (  f0  +  f1  )  g  n  1  /// Inne podejście - leniwy nieskończony ciąg liczb Fibonacciego  niech  fibSeq  =  Seq  .  rozwiń  (  zabawa  (  a  ,  b  )  ->  Niektóre  (  a  +  b  ,  (  b  ,  a  +  b  )))  (  ,  1  )  // Wydruk parzystych fibs  [  1  ..  10  ]  |>  Lista  .  map  fib  |>  Lista  .  filter  (  fun  n  ->  (  n  %  2  )  =  )  |>  printList  // To samo, używając wyrażenia listowego  [  for  i  in  1  ..  10  do  let  r  =  fib  i  if  r  %  2  =  then  yield  r  ]  |>  DrukujListę 

Przykładowy program Windows Forms:


 


      


  
           
       






 // Otwórz bibliotekę Windows Forms  open  System.Windows.Forms  // Utwórz okno i ustaw kilka właściwości  let  form  =  new  Form  (  Visible  =  true  ,  TopMost  =  true  ,  Text  =  "Welcome to F#"  )  // Utwórz etykietę aby wyświetlić tekst w formularzu  let  label  =  let  x  =  3  +  (  4  *  5  )  new  Label  (  Text  =  $  "{x}"  )  // Dodaj etykietę do formularza  formularza  .  Sterowanie  .  Dodaj  (  etykieta  )  // Na koniec uruchom formularz  [<  System  .  STAThread  >]  Aplikacja  .  Uruchom  (  formularz  ) 

Przykład programowania asynchronicznego równoległego (równoległe zadania procesora i wejścia/wyjścia):


   
         
                0


   
          


    
       
          
         
         
          
          


  
        ///  Prosty detektor liczb pierwszych  let  isPrime  (  n  :  int  )  =  letbound  =  int  (  sqrt  (  float  n  )  )  seq  {  2..bound  }  |  >  Seq  .  forall  (  fun  x  ->  n  %  x  <>  )  // Używamy asynchronicznych przepływów pracy  let  primeAsync  n  =  async  {  return  (  n  ,  isPrime  n  )  }  /// Zwracanie liczb pierwszych między m i n przy użyciu wielu wątków  let  primes  m  n  =  nast.  {  m  ..  n  }  |>  nast  .  mapa  primeAsync  |>  Async  .  Równoległy  |>  Asynchroniczny  .  Uruchom synchronicznie  |>  Tablica  .  filtr  snd  |>  Tablica  .  map  fst  // Uruchom test  liczby pierwsze  1000000  1002000  |>  Tablica  .  iteruj  (  printfn  "%d"  ) 

Zobacz też

Notatki

Linki zewnętrzne