F ostry (język programowania)
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 | , wersja 1.0
Wersja stabilna | |
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 | |
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 , | .NET 3.5 - 4.6.2, .NET Core , mono |
F# 4.5 | sierpień 2018 r | Linuks , macOS , Windows , | .NET 4.5 - 4.7.2, .NET Core SDK 2.1.400 | |
F# 4.6 | marzec 2019 r | Linuks , macOS , Windows , | .NET 4.5 - 4.7.2, .NET Core SDK 2.2.300 | |
F# 4.7 | wrzesień 2019 r | Linuks , macOS , Windows , | .NET 4.5 - 4.8, .NET Core SDK 3.0.100 | |
F# 5.0 | listopad 2020 r | Linuks , macOS , Windows , | .NET SDK 5.0.100 | |
F# 6.0 | listopad 2021 r | Linuks , macOS , Windows , | .NET SDK 6.0.100 | |
F# 7.0 | listopad 2022 r | Linuks , macOS , Windows , | .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.
Dodano funkcje | |
---|---|
F# 1.0 |
|
F# 2.0 |
|
F# 3.0 |
|
F# 3.1 |
|
F# 4.0 |
|
F# 4.1 |
|
F# 4.5 |
|
F# 4.6 |
|
F# 4.7 |
|
F# 5.0 |
|
F# 6.0 |
|
F# 7.0 |
|
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:
- Wszystko jest wyrazem
- Wnioskowanie o typie (przy użyciu wnioskowania o typie Hindleya – Milnera )
- Funkcje anonimowe z przechwytywaniem semantyki (tj. domknięć )
- Niezmienne zmienne i obiekty
- Leniwe wsparcie oceny
- Funkcje wyższego rzędu
- Funkcje zagnieżdżone
- Curry
- Dopasowanie wzorca
- Typy danych algebraicznych
- Krotki
- monad (nazywanych wyrażeniami obliczeniowymi )
- Optymalizacja połączeń ogonowych
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
-
dla
pętli -
pętle
while
-
tablice utworzone za pomocą
[| ... |]
składnia -
tablica mieszająca , utworzona za pomocą składni
dict [ ... ]
lub typuSystem.Collections.Generic.Dictionary<_,_> .
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
- Syme, Don ; Granicz, Adam; Cisternino, Antonio (2007), Expert F# , Apress
- Harrop, Jon (2010), Visual F# 2010 for Technical Computing , Flying Frog Consultancy
- Pickering, Robert (2007), Podstawy F# , Apress
- Smith, Chris (2009), Programowanie F# , O'Reilly
- Petricek, Tomas (2009), Programowanie funkcyjne w świecie rzeczywistym z przykładami w F # i C # , Manning Publications
- Hansen, Michael; Rischel, Hans (2013), Programowanie funkcyjne przy użyciu F # , Cambridge University Press
- Astborg, Johan (2013), F# for Quantitative Finance , Packt Publishing
- Lundin, Mikael (2015), Testowanie z F# , Packt Publishing
Linki zewnętrzne
- Oficjalna witryna internetowa F# Software Foundation
- Grupa Open Source języka F# w serwisie GitHub
- Centrum programistów Visual F# zarchiwizowane 2008-11-19 w Wayback Machine
- Tsunami, wbudowane środowisko F# IDE dla komputerów stacjonarnych
- Cloud Tsunami, wbudowane środowisko IDE Silverlight F#
- Wypróbuj język F# do nauki języka F# w przeglądarce internetowej
- Witryna fragmentów języka F#
- Blog zespołu Visual F#
- Oryginalna witryna Microsoft Research dla języka F#
- Planeta F#
- The F# Survival Guide, grudzień 2009 (książka internetowa)
- Specyfikacja języka F#
- Wprowadzenie do programowania w języku F# Zarchiwizowane 2011-07-13 w Wayback Machine
- Tutorial pokazujący proces dochodzenia do projektu funkcjonalnego; obejmuje testowanie i kodowanie równoległe
- Języki programowania .NET
- Bezpłatne oprogramowanie międzyplatformowe
- Języki funkcyjne
- Rodzina języków programowania ML
- Badania Microsoftu
- darmowe oprogramowanie Microsoftu
- Języki programowania Microsoftu
- Rodzina języków programowania OCaml
- Języki programowania dopasowujące wzorce
- Języki programowania stworzone w 2005 roku
- Języki programowania obsługujące jednostki miary
- Oprogramowanie korzystające z licencji Apache
- Oprogramowanie korzystające z licencji MIT
- Statycznie typowane języki programowania