F scharf (Programmiersprache)

F#
F Sharp logo.svg
F# Logomark
Paradigma Multi-Paradigma: funktional, Imperativ, objektorientierter, agentenorientiert, Metaprogrammierung, reflektierend, gleichzeitig
Familie Ml
Entworfen von Don Syme, Microsoft Research
Entwickler Microsoft, Die F# Software Foundation
Erstmals erschienen 2005; Vor 17 Jahren, Version 1.0
Stabile Version
6.0[1] Edit this on Wikidata / 19. Oktober 2021; vor 9 Monaten
Disziplin tippen Statisch, stark, gefolgert
OS Plattformübergreifend: .NETZ, .NET Framework, Mono
Lizenz MIT -Lizenz[2][3]
Dateiname -Erweiterungen .fs, .fsi, .fsx, .fsScript
Webseite fsharp.org
Beeinflusst von
C#, Erlang, Haskell,[4] Ml, Ocaml,[5][6] Python, Scala
Beeinflusst
C#,[7] Ulme, F*, Livescript
  • F scharfe Programmierung bei Wikibooks

F# (ausgesprochen F scharf) ist eine funktionale erste, allgemeine Zwecke, stark tippt, Multi-Paradigma Programmiersprache das umfasst funktional, Imperativ, und Objekt orientierte Programmierung Methoden. Es wird am häufigsten als plattformübergreifend verwendet Gemeinsame Sprachinfrastruktur (Cli) Sprache auf .NETZ, kann aber auch erzeugen JavaScript[8] und Grafikkarte (GPU) Code.[9]

F# wird von der entwickelt F# Software Foundation,[10] Microsoft und offene Mitwirkende. Ein Open Source, crad-plattform-Compiler für F# ist bei der F# Software Foundation erhältlich.[11] F# ist eine voll unterstützte Sprache in Visual Studio[12] und Jetbrains Rider.[13] Plugins Unterstützung f# gibt es für viele weit verbreitete Redakteure, einschließlich Visual Studio -Code, Vim, und EMACs.

F# ist ein Mitglied der Ml Sprachfamilie und entstand als .NET Framework Implementierung eines Kerns der Programmiersprache Ocaml.[5][6] Es wurde auch von beeinflusst von C#AnwesendPython, Haskell,[4] Scala und Erlang.

Geschichte

Versionen

Ausführung Sprachspezifikation Datum Plattformen Laufzeit
F# 1.x Mai 2005[14] Fenster .NETZ 1.0 - 3,5
F# 2.0 August 2010 April 2010[15] Linux, Mac OS, Fenster .NETZ 2.0 - 4.0, Mono
F# 3.0 November 2012 August 2012[16] Linux, Mac OS, Fenster;
JavaScript,[8] GPU[9]
.NETZ 2.0 - 4.5, Mono
F# 3.1 November 2013 Oktober 2013[17] Linux, Mac OS, Fenster;
JavaScript,[8] GPU[9]
.NETZ 2.0 - 4.5, Mono
F# 4.0 Januar 2016 Juli 2015[18]
F# 4.1 Mai 2018 März 2017[19] Linux, Mac OS, FensterAnwesend

JavaScript,[8] GPU[9]

.NETZ 3,5 - 4.6.2, .NET CORE, Mono
F# 4.5 August 2018[20] Linux, Mac OS, FensterAnwesend

JavaScript,[8] GPU[9]

.NETZ 4,5 - 4.7.2,[21] .NET CORE SDK 2.1.400[22]
F# 4.6 March 2019[23] Linux, Mac OS, FensterAnwesend

JavaScript,[8] GPU[9]

.NETZ 4,5 - 4.7.2,[24] .NET CORE SDK 2.2.300[25]
F# 4.7 September 2019[26] Linux, Mac OS, FensterAnwesend

JavaScript,[8] GPU[9]

.NETZ 4,5 - 4.8,[27] .NET CORE SDK 3.0.100[28]
F# 5.0 November 2020[29] Linux, Mac OS, FensterAnwesend

JavaScript,[8] GPU[9]

.NETZ SDK 5.0.100[30]
F# 6.0 November 2021[31] Linux, Mac OS, FensterAnwesend

JavaScript,[8] GPU[9]

.NETZ SDK 6.0.100[32]

Sprachentwicklung

F# verwendet einen offenen Entwicklungs- und Engineering -Prozess. Der Sprachentwicklungsprozess wird von verwaltet von Don Syme aus Microsoft Research als die Wohlwollender Diktator für das Leben (BDFL) für das Sprachdesign zusammen mit der F# Software Foundation. Frühere Versionen der F# -Sprache wurden von entworfen von Microsoft und Microsoft Research Verwendung eines geschlossenen Entwicklungsprozesses.

F# stammt von Microsoft Research, Cambridge, Großbritannien. Die Sprache wurde ursprünglich von entworfen und implementiert von Don Syme,[5] Nach wem im FSHARP -Team sagen sie, dass das F für "Spaß" ist.[33] Andrew Kennedy trug zum Design von bei Maßeinheiten.[5] Die Visual F# Tools für Visual Studio wurden von Microsoft entwickelt.[5] Die F# Software Foundation entwickelte den F# Open-Source-Compiler und die Tools mit der Open-Source-Compiler-Implementierung des Microsoft Visual F# Tools-Teams.[10]

Zusammenfassung der Versionen
Funktionen hinzugefügt
F# 1.0
  • Funktionelle Programmierung
  • Diskriminierte Gewerkschaften
  • Aufzeichnungen
  • Tupel
  • Musteranpassung
  • Typ Abkürzungen
  • Objekt orientierte Programmierung
  • Strukturen
  • Signaturdateien
  • Skriptdateien
  • Imperative Programmierung
  • Module (keine Functors)
  • Verschachtelte Module
  • .NET Interoperabilität
F# 2.0
  • Aktive Muster
  • Maßeinheiten
  • Sequenzausdrücke
  • Asynchrone Programmierung
  • Agentenprogrammierung
  • Verlängerungsmitglieder
  • Benannte Argumente
  • Optionale Argumente
  • Arrayschneide
  • Zitate
  • Einheimische Interoperabilität
  • Berechnungsausdrücke
F# 3.0[34]
  • Typ Anbieter
  • LINQ -Abfrageausdrücke
  • Klimabeschreibung
  • Dreifach zitierte Saiten
  • Auto-Properties
  • Bereitstellung von Messeinheiten
F# 3.1[35]
  • Benannte Gewerkschaftsfelder
  • Erweiterungen zum Array -Schneiden
  • Typ -Inferenzverbesserungen
F# 4.0[36]
  • Printf auf einheitlichten Werten
  • Verlängerungseigenschaft initializer
  • Nicht-Null-Bereitstellung Typen
  • Primärkonstruktoren als Funktionen
  • Statische Parameter für bereitgestellte Methoden
  • Printf Interpolation
  • Erweiterte Grammatik
  • Tailcall -Attribut
  • Mehrere Schnittstellen -Instanziationen
  • Optionale Typ args
  • Params Wörterbücher
F# 4.1[37]
  • Struktur Tupel, die mit C# Tupeln interpretieren
  • Strukturanmerkungen für Aufzeichnungen
  • Strukturanmerkungen für Einzelfall-diskriminierte Gewerkschaften
  • Unterstreicht in numerischen Literalen
  • Anruferinfo -Argumentattribute
  • Ergebnisart und einige grundlegende Ergebnisfunktionen
  • Gegenseitige Referenztypen und Module in derselben Datei
  • Implizite "Modul" -Syntax auf Modulen mit gemeinsamem Namen als Typ
  • BYREF kehrt zurück und unterstützt die Verbrauchsmodethoden mit Ref-Returning-Methoden
  • Fehlermeldung Verbesserungen
  • Unterstützung für "fest"
F# 4.5[29]
  • Versioning -Ausrichtung von Binär-, Paket und Sprache
  • Unterstützung für 'Span <T>' und verwandte Typen
  • Fähigkeit zur Herstellung von 'ByRef' Renditen
  • Der Typ "voidptr"
  • Die "INREF <'T>" und "OUTREF <' T> ', um readonly und schreibende ByRef zu repräsentieren
  • 'Isbyreflike' Strukturen
  • "IsReadonly" Strukturen
  • Erweiterungsmethode Unterstützung für 'BYREF <' T> '/' INREF <'T>'/'OUTREF <' T> ''
  • 'passen!' Schlüsselwort in Berechnungsausdrücken
  • Entspannter Upcast mit 'Ertrag' in F# SEQ/List/Array Expressions
  • Entspannte Einkerbung mit Listen- und Array -Ausdrücken
  • Aufzählungsfälle als öffentlich ausgestrahlt
F# 4.6
  • Anonyme Typen
F# 4.7[38]
  • Implizite Erträge
  • Keine erforderlichen doppelten Unterstriche mehr
  • Einkerbungsrelaxationen für Parameter, die an Konstruktoren und statische Methoden übergeben wurden
  • 'nameof' Funktion
  • Öffnen statische Klassen
F# 5.0[39]
  • FSHARP.CORE zielt jetzt nur an NetSpandard2.0
  • Paketreferenzen in F# Skripten
  • Unterstützung für Jupyter-, Nteract- und VSCODE -Notizbücher
  • String -Interpolation
  • Unterstützung für den Namen
  • Offene Typdeklarationen
  • Verbessertes Schneiden
  • F# Zitate Verbesserungen
  • Anwendungsberechnungsausdrücke
  • Verbesserte Stapelspuren in F# Async und anderen Berechnungsausdrücken
  • Verbesserte .NET Interop
  • Verbesserte Karte und Einstellung der Leistung in FSHARP.Core
  • Verbesserte Compiler -Leistung
  • Verbesserte Compiler -Analyse für Bibliotheksautoren
F# 6.0[40]
  • Aufgaben
  • Einfachere Indizierung
  • Erweitert zu "aktiven Mustern"
  • Überlastete benutzerdefinierte Operationen in Berechnungsausdrücken
  • "Als" Muster
  • Eindrückungs -Syntax -Revisionen
  • Zusätzliche implizite Conversions
  • Zusätzliche implizite Upcast Conversions
  • Implizite Ganzzahlkonvertierungen
  • Erstklassige Unterstützung für implizite Conversions im .Net-Stil
  • Optionale Warnungen für implizite Conversions
  • Formatierung für binäre Zahlen
  • Verwendet bei Gebrauchskindungen
  • Inlineiflambda Optimierer -Richtlinie
  • Wiederaufnahmeer Code
  • Zusätzliche Sammelfunktionen
  • Karte hat Schlüssel und Werte
  • Zusätzliche Intrinsik für nativ
  • Zusätzliche numerische Typen mit Anmerkungen der Einheit
  • Informationswarnungen für selten verwendete symbolische Operatoren

Sprachübersicht

Funktionelle Programmierung

F# ist während der Unterstützung von objektorientierten Funktionen, die in C# verfügbar sind stark tippt funktionale erste Sprache mit einer großen Anzahl von Fähigkeiten, die normalerweise nur in gefunden werden Funktionelle Programmierung Sprachen. Zusammen können diese Funktionen ermöglichen, dass F# -Programme in einem vollständig funktionalen Stil geschrieben werden und auch funktionale und objektorientierte Stile gemischt werden können.

Beispiele für funktionale Merkmale sind:

F# ist eine ausdrucksbasierte Sprache mit Verwendung eifrige Bewertung und auch in einigen Fällen faule Bewertung. Jede Aussage in F#, einschließlich wenn Ausdrücke, Versuchen Ausdrücke und Schleifen sind ein komponierbarer Ausdruck mit einem statischen Typ.[43] Funktionen und Ausdrücke, die keinen Wert zurückgeben Einheit. F# verwendet die Lassen Schlüsselwort zum Binden von Werten an einen Namen.[43] Zum Beispiel:

Lassen x = 3 + 4 

bindet den Wert 7 zum Namen x.

Neue Typen werden mit dem definiert Typ Stichwort. Für die funktionale Programmierung bietet F# Tupel, Aufzeichnung, Diskriminierte Gewerkschaft, aufführen, Möglichkeit, und Ergebnis Typen.[43] A Tupel repräsentiert einen Satz von n Werte, wo n ≥ 0. der Wert n wird genannt Arity des Tupels. Ein 3-Tupel würde als dargestellt als (A, b, c), wo a, b und c Werte für möglicherweise unterschiedliche Typen sind. Ein Tupel kann verwendet werden, um Werte nur zu speichern, wenn die Anzahl der Werte zur Designzeit bekannt ist und während der Ausführung konstant bleibt.

A Aufzeichnung ist ein Typ, bei dem die Datenmitglieder benannt sind. Hier ist ein Beispiel für die Datensatzdefinition:

 Typ R =   { Name : Saite   Das Alter : int } 

Datensätze können als erstellt werden let r = { Name="AB"; Age=42 }. Das mit Das Schlüsselwort wird verwendet, um eine Kopie eines Datensatzes zu erstellen, wie in { r with Name="CD" }, was einen neuen Rekord durch Kopieren erzeugt r und den Wert des Werts ändern Name Feld (unter der Annahme des im letzten Beispiels erstellten Datensatzes wurde benannt r).

A Diskriminierte Gewerkschaft Typ ist a Typ-Safe Version von C Gewerkschaften. Zum Beispiel,

 Typ A =   | Aßcasex von Saite  | Unioncasey von int 

Die Werte des Gewerkschaftstyps können einem der beiden Gewerkschaftsfall entsprechen. Die Arten der Werte, die von jedem Gewerkschaftsfall übernommen werden, sind in der Definition des einzelnen Falls enthalten.

Das aufführen Typ ist unveränderlich verlinkte Liste entweder mit a dargestellt head::tail Notation (:: ist der Nachteile Betreiber) oder eine Abkürzung als [item1; item2; item3]. Eine leere Liste wird geschrieben []. Das Möglichkeit Typ ist ein diskriminierter Gewerkschaftstyp mit Auswahlmöglichkeiten Einige (x) oder Keiner. F# Typen können sein generisch, implementiert als generische .NET -Typen.

F# unterstützt Lambda Funktionen und Schließungen.[43] Alle Funktionen in F# sind erstklassige Werte und sind unveränderlich.[43] Funktionen können sein Curry. Als erstklassige Werte können Funktionen als Argumente an andere Funktionen übergeben werden. Wie andere funktionale Programmiersprachen erlaubt F# Funktionszusammensetzung (Informatik) Verwendung der >> und << Betreiber.

F# bietet Sequenzausdrücke[44] das definiert eine Sequenz seq {...}, aufführen [...] oder Array [| ... |] über Code, der Werte generiert. Zum Beispiel,

 seq { zum b in 0 .. 25 tun  wenn b < 15 dann  Ertrag b*b } 

bildet eine Folge von Quadraten von Zahlen von 0 bis 14, indem Zahlen aus dem Zahlenbereich von 0 bis 25 herausgefiltert werden. Sequenzen sind Generatoren -Werte werden auf Nachfrage generiert (d. H. sind faul ausgewertet) - während Listen und Arrays eifrig bewertet werden.

F# verwendet Musteranpassung Werte an Namen binden. Bei dem Zugriff auf diskriminierte Gewerkschaften wird auch eine Musteranpassung verwendet - die Gewerkschaft ist Wert gegen Musterregeln und eine Regel wird ausgewählt, wenn eine Übereinstimmung erfolgreich ist. F# unterstützt auch Aktive Muster als eine Form eines erweiterbaren Musteranpassungen.[45] Es wird beispielsweise verwendet, wenn mehrere Arten des Anpassung an einem Typ existieren.[43]

F# unterstützt eine allgemeine Syntax für die Definition von Zusammensetzungsberechnungen, die genannt werden Berechnungsausdrücke. Sequenzausdrücke, asynchrone Berechnungen und Abfragen sind bestimmte Arten von Berechnungsausdrücken. Berechnungsausdrücke sind eine Implementierung der monad Muster.[44]

Imperative Programmierung

F# Unterstützung für imperative Programmierung umfasst

  • zum Schleifen
  • während Schleifen
  • Arrays, erstellt mit dem [| ... |] Syntax
  • Hash-tabelle, erstellt mit dem DICT [...] Syntax oder System.Collectionss.generic.Dictionary <_, _> Typ.

Werte und Datensatzfelder können auch als als bezeichnet werden veränderlich. Zum Beispiel:

// 'x' mit dem Anfangswert '1' definieren Lassen veränderlich x = 1 // Ändern Sie den Wert von 'x' auf '3' x <- 3 

Außerdem unterstützt F# den Zugriff auf alle CLI -Typen und -objekte, wie sie in der definiert sind System.Collectionss.generic Namespace Definieren imperativen Datenstrukturen.

Objekt orientierte Programmierung

Wie andere Gemeinsame Sprachinfrastruktur (CLI) Sprachen, F# kann CLI-Typen durch objektorientierte Programmierung verwenden.[43] F# Unterstützung für objektorientierte Programmierung in Ausdrücken umfasst::

  • DOT-NOTATION, z. B.,, x.Name
  • Objektausdrücke, z. B., { new obj() with member x.ToString() = "hello" }
  • Objektkonstruktion, z. B.,, new Form()
  • Typtests, z. B.,, x :? string
  • Typzussionen, z. B.,, x :?> string
  • Benannte Argumente, z. B., x.Method(someArgument=1)
  • Setters namens, z. B.,, new Form(Text="Hello")
  • Optionale Argumente, z. B., x.Method(OptionalArgument=1)

Unterstützung für objektorientierte Programmierung in Mustern umfasst

  • Typtests, z. B.,, :? string as s
  • Aktive Muster, die über Objekttypen definiert werden können[45]

Definitionen für f# Objekttypen können Klassen-, Strukturm-, Schnittstellen-, Enum- oder Delegierende Definitionen sein, die den in den Definitionsformen gefundenen Definitionsformen entsprechen C#. Zum Beispiel ist hier eine Klasse mit einem Konstruktor, der einen Namen und Alter nimmt und zwei Eigenschaften erklärt.

/// eine einfache Definition des Objekttyps Typ Person(Name : Saite, das Alter : int) =  Mitglied x.Name = Name  Mitglied x.Das Alter = das Alter 

Asynchrone Programmierung

F# unterstützt Asynchrone Programmierung durch Asynchrone Workflows.[46] Ein asynchroner Workflow wird als eine Folge von Befehlen in einem definiert Async {...}, wie in

Lassen Asynctask =   Async { Lassen Req = WebRequest.Schaffen(URL)  Lassen! Antwort = Req.Getresponseasync()  verwenden Strom = Antwort.GetresponSstream()  verwenden StreamReader = Neu System.Io.StreamReader(Strom)  Rückkehr StreamReader.Lectoend() } 

Das Lassen! Zeigt an, dass der Ausdruck rechts (das Erhalten der Antwort) asynchron erfolgen sollte, der Fluss jedoch nur so weitergehen sollte, wenn das Ergebnis verfügbar ist. Mit anderen Worten, aus der Sicht des Codeblocks ist es, als ob das Erhalten der Antwort ein Blockierungsanruf ist, während aus der Sicht des Systems der Thread nicht blockiert wird und kann verwendet werden, um andere Ströme zu verarbeiten Das für diesen benötigte Ergebnis wird zwar nicht verfügbar.

Der asynchrische Block kann mit dem aufgerufen werden Async.runsynchronous Funktion. Mehrere asynchronisierte Blöcke können parallel mit dem ausgeführt werden Async.parallel Funktion, die eine Liste von übernimmt Async Objekte (im Beispiel, Asynctask ist ein asynchrones Objekt) und erstellt ein anderes asynchrones Objekt, um die Aufgaben in den Listen parallel auszuführen. Das resultierende Objekt wird mit Verwendung aufgerufen Async.runsynchronous.[46] Kontrollinversion In F# folgt diesem Muster.[46]

Parallele Programmierung

Parallele Programmierung wird teilweise durch die unterstützt Async.parallel, Async.start und andere Operationen, die asynchrone Blöcke parallel ausführen.

Parallele Programmierung wird auch durch die unterstützt Array.Parallel Funktionelle Programmierbetreiber in der F# Standardbibliothek, direkte Verwendung des System.Threading.tasks Task -Programmiermodell, direkte Verwendung von .NET -Threadpool und .NET -Threads und durch dynamische Übersetzung von F# Code in alternative parallele Ausführungsmotoren wie z. GPU[9] Code.

Maßeinheiten

Das F# -Typsystem unterstützt Maßeinheiten Überprüfung nach Zahlen.[47] Die Funktionen der Messfunktion integrieren in die Inferenz von F# Typ, um minimale Anmerkungen im Benutzercode zu benötigen.[48]

Metaprogrammierung

F# ermöglicht einige Formen der Syntax -Anpassung über Metaprogrammierung Um das Einbettung von Brauch zu unterstützen Domänenspezifische Sprachen Innerhalb der F# -Sprache, insbesondere durch Berechnungsausdrücke.[43]

F# enthält eine Funktion für die Laufzeit-Metaprogrammierung, die als Zitate bezeichnet wird.[49] Ein Zitatausdruck bewertet eine abstrakte Syntaxbaumdarstellung der F# -Ausdrücke. In ähnlicher Weise sind Definitionen mit dem gekennzeichnet [] Das Attribut kann auch in ihrem Anführungsformular zugegriffen werden. F# Zitate werden für verschiedene Zwecke verwendet, einschließlich zum Kompilieren von F# Code in JavaScript[8] und GPU[9] Code. (Zitate stellen ihre F# -Codesausdrücke als Daten für die Verwendung durch andere Teile des Programms dar, während es syntaktisch korrigiert wird, f# Code).

Informationsreiche Programmierung

F# 3.0 führte eine Form der Kompilierungszeit-Metaprogrammierung durch eine statisch erweiterbare Artgenerierung ein, die als F# -Typanbieter bezeichnet wird.[50] Mit F# -Typanbietern können der F# Compiler und die Tools mit Komponenten erweitert werden, die zum Kompilierungszeitpunkt Typinformationen für den Compiler on-Demand zur Verfügung stellen. F# -Typanbieter wurden verwendet, um einen stark typisierten Zugriff auf vernetzte Informationsquellen auf skalierbare Weise zu gewähren, einschließlich der Werfebasis Wissensgrafik.[51]

In F# 3.0 werden die Funktionen F# Zitat und Berechnungsausdruck kombiniert, um es zu implementieren Linq Abfragen.[52] Zum Beispiel:

// Verwenden Sie den ODATA -Typ Anbieter, um Typen zu erstellen, mit denen Sie auf die Northwind -Datenbank zugreifen können. offen Microsoft.fsharp.data.typeProviders Typ Nordwind = Odataservice<"http://services.odata.org/northwind/northwind.svc"> Lassen db = Nordwind.GetDatacontext() // ein Abfrageausdruck. Lassen Abfrage1 = Anfrage { zum Kunde in db.Kunden tun  auswählen Kunde } 

Die Kombination von Typanbietern, Abfragen und stark typisierten funktionellen Programmierungen ist als bekannt als Informationsreiche Programmierung.[53]

Agentenprogrammierung

F# unterstützt eine Variation der Schauspieler Programmiermodell durch die Implementierung von leichten asynchronen Wirkstoffen in Memory. Der folgende Code definiert beispielsweise einen Agenten und veröffentlicht 2 Nachrichten:

Lassen Zähler =  Mailboxprozessor.Anfang(Spaß Posteingang ->  Lassen Rec Schleife n =  Async { tun printfn "n = %d, wartet ..." n  Lassen! Nachricht = Posteingang.Erhalten()  Rückkehr! Schleife(n+Nachricht) }  Schleife 0) 

Entwicklungswerkzeuge

  • Visual Studio, mit den visuellen F# -Tools von Microsoft Installiert, kann zum Erstellen, Ausführen und Debuggen von F# -Projekten verwendet werden. Die visuellen F# -Tools enthalten ein visuelles Studio, das veranstaltet wurde Read -E -druck -Schleife (Repl) Interaktive Konsole, die den F# -Codel ausführen kann, wie sie geschrieben wird. Visual Studio für Mac unterstützt auch F# -Projekte.
  • Visual Studio -Code enthält die volle Unterstützung für F# über die Ionid -Erweiterung.
  • F# kann mit jedem Texteditor entwickelt werden. Spezifische Unterstützung gibt es bei Redakteuren wie z. EMACs.
  • Jetbrains Rider ist für die Entwicklung des F# -Codes ab Release 2019.1 optimiert.[54]
  • Linqpad hat F# seit Version 2.x unterstützt.[Deren?]

Anwendungsbereiche

F# ist a Allzweckprogrammiersprache.

Web Programmierung

Das Sicherer Stapel ist ein End-to-End-F# Stack zur Entwicklung von Webanwendungen. Es verwendet ASP.NET CORE Auf der Serverseite und Fabel Auf der Clientseite.[55]

Eine alternative End-to-End-Option ist die Option Websharper Rahmen.[56]

Plattformübergreifende App-Entwicklung

F# kann zusammen mit dem verwendet werden Visual Studio -Tools für Xamarin Apps für die Entwicklung von Apps für iOS und Android. Das Fabelhaft Die Bibliothek bietet eine komfortablere funktionale Schnittstelle.

Analytische Programmierung

Unter anderem wird F# für die quantitative Finanzierungsprogrammierung verwendet,[57] Energiehandel und Portfoliooptimierung,[58] maschinelles Lernen,[59] Business Intelligence[60] und soziale Spiele auf Facebook.[61]

In den 2010er Jahren wurde F# als optimierte Alternative zu positioniert C#. Die Skriptfähigkeit und die Kompatibilität zwischen Sprache mit allen Microsoft-Produkten haben es bei Entwicklern beliebt.[62]

Scripting

F# kann als Skriptsprache verwendet werden, hauptsächlich für Desktop Read -E -druck -Schleife (Repl.) Scripting.[63]

Open-Source-Community

Das f# Open Source Community umfasst die F# Software Foundation[10] und die F# Open Source -Gruppe bei GitHub.[11] Beliebte Open-Source-F# -Projekte umfassen:

  • Fabel, ein F# zu JavaScript -Transpiler basierend auf Babel.
  • Paket, einen alternativen Paketmanager für .NET, der noch verwenden kann NuGet Repositories, hat aber eine zentralisierte Version des Versionsmanagements.
  • GEFÄLSCHT, ein F# Friendly Build-System.
  • Giraffe, eine funktional orientierte Middleware für ASP.NET CORE.
  • Suave, eine leichte Webserver- und Webentwicklungsbibliothek.

Kompatibilität

F# verfügt über einen älteren "ML -Kompatibilitätsmodus", mit dem Programme, die in einer großen Untergruppe von OCAML grob geschrieben sind, ohne Funktionen, Objekte, polymorphe Varianten oder andere Ergänzungen direkt kompilieren können.

Beispiele

Es folgen ein paar kleine Proben:

// Dies ist ein Kommentar für ein Beispiel für ein Beispiel für ein Beispiel für das Hello World. printfn "Hallo Welt!" 

Eine Personklasse mit einem Konstruktor, der einen Namen und Alter und zwei unveränderliche Eigenschaften nimmt.

/// Dies ist ein Dokumentationskommentar für eine Typdefinition. Typ Person(Name : Saite, das Alter : int) =  Mitglied x.Name = Name  Mitglied x.Das Alter = das Alter      /// Klasse Instantiation Lassen Herr smith = Person("Schmied", 42) 

Ein einfaches Beispiel, das häufig verwendet wird, um die Syntax der funktionalen Sprachen zu demonstrieren, ist die faktorielle Funktion Für nicht negative 32-Bit-Ganzzahlen, hier in F#gezeigt:

/// Unter Verwendung des Muster -Matching -Ausdrucks Lassen Rec Fakultät n =  passen n mit  | 0 -> 1  | _ -> n * Fakultät (n - 1) /// für eine Einzelargument-Funktion gibt es syntaktische Zucker (Musteranpassungsfunktion): Lassen Rec Fakultät = Funktion   | 0 -> 1   | n -> n * Fakultät (n - 1)      /// Falten- und Bereichsoperator verwenden Lassen Fakultät n = [1..n] |> Seq.falten (*) 1 

Iterationsbeispiele:

/// Iteration mit einer 'für' Schleife Lassen Printliste lst =   zum x in lst tun  printfn "%d" x /// Iteration unter Verwendung einer Funktion höherer Ordnung Lassen Printlist2 lst =   Aufführen.Iter (printfn "%d") lst /// Iteration unter Verwendung einer rekursiven Funktion und Musteranpassung Lassen Rec Printlist3 lst =  passen lst mit  | [] -> ()  | h :: t ->  printfn "%d" h  Printlist3 t 

Beispiele für Fibonacci:

/// Fibonacci -Nummerformel Lassen Flunkerei n =  Lassen Rec g n f0 F1 =  passen n mit  | 0 -> f0  | 1 -> F1  | _ -> g (n - 1) F1 (f0 + F1)  g n 0 1 /// Ein anderer Ansatz - eine faule unendliche Abfolge von Fibonacci -Zahlen Lassen Fibseq = Seq.entfalten (Spaß (a,b) -> Etwas(a+b, (b, a+b))) (0,1) // sogar Fibs drucken [1 .. 10] |> Aufführen.Karte  Flunkerei |> Aufführen.Filter  (Spaß n -> (n % 2) = 0) |> Printliste // gleiche Sache mit einem Listenausdruck [ zum i in 1..10 tun  Lassen r = Flunkerei i  wenn r % 2 = 0 dann Ertrag r ] |> Printliste 

Ein Beispiel -Windows -Formulierprogramm:

// Öffnen Sie die Windows Forms -Bibliothek offen System.Windows.forms // Erstellen Sie ein Fenster und setzen Sie einige Eigenschaften ein Lassen bilden = Neu Bilden(Sichtbar=Stimmt, Oberste=Stimmt, Text="Willkommen bei F#") // Erstellen Sie ein Etikett, um einen Text im Formular anzuzeigen Lassen Etikett =  Lassen x = 3 + (4 * 5)  Neu Etikett(Text = $"{x}") // Fügen Sie das Etikett zum Formular hinzu bilden.Kontrollen.Hinzufügen(Etikett) // Führen Sie schließlich das Formular aus [<<System.Stathread>]] Anwendung.Laufen(bilden) 

Asynchrone parallele Programmierprobe (parallele CPU- und E/A -Aufgaben):

/// Ein einfacher Primzahl -Detektor Lassen isprime (n:int) =  Lassen gebunden = int (sqrt (schweben n))  seq {2 .. gebunden} |> Seq.für alle (Spaß x -> n % x <> 0) // Wir verwenden asynchrische Workflows Lassen Primeasync n =  Async { Rückkehr (n, isprime n) } /// Primzahlen zwischen m und n mit mehreren Threads zurückgeben Lassen Primzahlen m n =  seq {m .. n}  |> Seq.Karte Primeasync  |> Async.Parallel  |> Async.Runsynchron  |> Array.Filter snd  |> Array.Karte fst // einen Test ausführen Primzahlen 1000000 1002000  |> Array.Iter (printfn "%d") 

Siehe auch

Anmerkungen

  1. ^ https://devblogs.microsoft.com/dotnet/announcing-net-6/.
  2. ^ "F# Software Foundation Lizenz". GitHub. 14. Oktober 2021.
  3. ^ "Microsoft F# Lizenz". GitHub. 16. Oktober 2021.
  4. ^ a b Syme, Granicz & Cisternino (2007: 2)
  5. ^ a b c d e "F# Historische Anerkennung". Abgerufen 2012-11-24.
  6. ^ a b Syme, Don (2006). "Nutzung von .NET-Meta-Programmierkomponenten von F#". [F#] ist im Kern -ML -Design verwurzelt und hat insbesondere eine Kernsprache, die weitgehend mit der von OCAML kompatibel ist
  7. ^ Für Async
  8. ^ a b c d e f g h i j Die F# Software Foundation. "Verwenden Sie F# für Webanwendungen". Abgerufen 2020-07-30.
  9. ^ a b c d e f g h i j k Die F# Software Foundation. "Verwenden Sie F# für die GPU -Programmierung". Archiviert von das Original Am 2019-12-25. Abgerufen 2019-12-25.
  10. ^ a b c Die F# Software Foundation. "Die F# Software Foundation". Abgerufen 2012-11-24.
  11. ^ a b Die F# Software Foundation. "F# Compiler (Open Source Edition) @ Github". Abgerufen 2012-11-24.
  12. ^ "Mit visuellem F# in Visual Studio entwickeln". Abgerufen 2020-07-30.
  13. ^ "F#". Abgerufen 2020-07-30.
  14. ^ Syme, Don. "F# 1.0.8 veröffentlicht". Microsoft. Abgerufen 7. September, 2014.
  15. ^ Syme, Don. "F# 2.0 als Teil von Visual Studio 2010 veröffentlicht". Microsoft. Abgerufen 7. September, 2014.
  16. ^ Zander, Jason. "Visual Studio 2012 und .NET Framework 4.5 im Web veröffentlicht". Microsoft. Abgerufen 7. September, 2014.
  17. ^ "Visual Studio 2013 im Web veröffentlicht". Microsoft. Abgerufen 7. September, 2014.
  18. ^ "Ankündigung des RTM von Visual F# 4.0". Microsoft. Abgerufen 15. September, 2015.
  19. ^ "Ankündigung von F# 4.1 und den visuellen F# Tools für Visual Studio 2017". Abgerufen 2017-03-08.
  20. ^ "F# 4.5 ankündigen". Microsoft. 14. August 2018. Abgerufen 14. August, 2018.
  21. ^ "Fsharp.core 4.5.0".
  22. ^ "Download .net Core 2.1 (Linux, MacOS und Windows)". Microsoft. Abgerufen 13. Mai, 2021.
  23. ^ "F# 4.6 ankündigen". Microsoft. 29. März 2019. Abgerufen 29. März, 2019.
  24. ^ "Fsharp.core 4.6.0".
  25. ^ "Download .net Core 2.2 (Linux, MacOS und Windows)". Microsoft. Abgerufen 13. Mai, 2021.
  26. ^ "F# 4.7 ankündigen". Microsoft. 23. September 2019. Abgerufen 23. September, 2019.
  27. ^ "Fsharp.core 4.7.0".
  28. ^ "Download .net Core 3.0 (Linux, MacOS und Windows)". Microsoft. Abgerufen 13. Mai, 2021.
  29. ^ a b "F# 5 ankündigen". 10. November 2020.
  30. ^ "Download .net 5.0 (Linux, MacOS und Windows)". Microsoft. Abgerufen 13. Mai, 2021.
  31. ^ "F# 6 ist offiziell hier!". 9. November 2021.
  32. ^ "Download .net 6.0 (Linux, MacOS und Windows)". Microsoft. Abgerufen 14. November, 2021.
  33. ^ Edwards, Kathryn (23. Dezember 2008). "Der A-Z der Programmiersprachen: F#". networkworld.com. Idg. Archiviert von das Original am 13. November 2018. Abgerufen 8. August 2016.
  34. ^ McNamara, Brian. "Mehr über F# 3.0 -Sprachfunktionen". Microsoft. Abgerufen 7. September, 2014.
  35. ^ McNamara, Brian. "Ankündigung einer Vorveröffentlichung von F# 3.1". Microsoft. Abgerufen 7. September, 2014.
  36. ^ "Ankündigung des RTM von Visual F# 4.0". Abgerufen 2017-03-08.
  37. ^ "Ankündigung von F# 4.1 und den visuellen F# Tools für Visual Studio 2017". Abgerufen 2017-03-08.
  38. ^ "F# 4.7 ankündigen". 23. September 2019.
  39. ^ "F# 5 ankündigen". 10. November 2020.
  40. ^ "Was ist neu in F# 6 - F# Guide".
  41. ^ "F scharfe Programmier-/Berechnungsausdrücke - Wikibooks, offene Bücher für eine offene Welt". en.wikibooks.org. Abgerufen 2022-01-21.
  42. ^ Kexugit. "Schwanz ruft in F#auf". docs.microsoft.com. Abgerufen 2022-04-22.
  43. ^ a b c d e f g h "F# Sprachübersicht" (PDF). Abgerufen 2007-12-14.
  44. ^ a b "Einige Details zu Ausdrücken von F# berechneten". Abgerufen 2007-12-14.
  45. ^ a b "Musteranpassung in F# Teil 2: Aktive Muster". Archiviert von das Original Am 2012-12-09. Abgerufen 2012-11-24.
  46. ^ a b c "Einführung von F# Asynchronen Workflows". Abgerufen 2007-12-14.
  47. ^ "Maßeinheiten (F#)". Abgerufen 2012-11-24.
  48. ^ "Maßeinheiten in F#: Teil 1, Einführung von Einheiten". Abgerufen 2012-11-24.
  49. ^ "Code -Zitate (F#)". Abgerufen 2012-11-24.
  50. ^ "Typ Anbieter". Abgerufen 2012-11-24.
  51. ^ "Neuem Tech-Bericht von Microsoft Research: stark getotische Sprachunterstützung für Informationsquellen im Internetmaßstab". Abgerufen 2012-11-24.
  52. ^ "Abfrageausdrücke (F#)". Abgerufen 2012-11-24.
  53. ^ "F# 3.0 - LINQ + Typ Anbieter = Information Rich Programing". Abgerufen 2012-11-24.
  54. ^ Alexander Kurakin. "Rider 2019.1 startet sein frühes Zugangsprogramm!".
  55. ^ "Fabel: JavaScript, auf die Sie stolz sein können!". fabel.io. Abgerufen 2017-12-09.
  56. ^ Intellifaktorisch. "Websharper Home". Abgerufen 2012-11-24.
  57. ^ "Microsoft -Fallstudien: Microsoft Visual Studio 2012 - Finanzdienstleistungsunternehmen". Microsoft. Abgerufen 2012-11-25.
  58. ^ "F# für Energiehandel und Portfoliooptimierung". Abgerufen 2012-11-25.
  59. ^ "Microsoft Fallstudie: Grange Insurance". Microsoft. Abgerufen 2012-11-25.
  60. ^ Trelford, Phil (2007). "Lernen mit F#". Verfahren des 4. ACM Sigplan Workshops über kommerzielle Benutzer der funktionalen Programmierung - CUFP '07. CUFP '07. S. 1–2. doi:10.1145/1362702.1362709. ISBN 9781450378444. S2CID 24018363. Abgerufen 2012-11-25.
  61. ^ "F# Job in Facebook Social Gaming". Abgerufen 2012-11-25.
  62. ^ "F# Entwickler Testimonials". Abgerufen 25. Mai, 2021.
  63. ^ "Scripting in F#". Abgerufen 2020-01-17.

Verweise

  • Syme, Don; Granicz, Adam; Zisternino, Antonio (2007), Experte F#, Apress
  • Harrop, Jon (2010), Visual F# 2010 für technisches Computing, Fliegende Froschberatung
  • Pickering, Robert (2007), Grundlagen von F#, Apress
  • Smith, Chris (2009), Programmierung f#, O'Reilly
  • Petricek, Tomas (2009), Funktionelle Programmierung realer Welt mit Beispielen in F# und C#, Manning Publications
  • Hansen, Michael; Rischel, Hans (2013), Funktionelle Programmierung mit F#, Cambridge University Press
  • Astborg, Johan (2013), F# für quantitative Finanzen, Packt Publishing
  • Lundin, Mikael (2015), Testen mit F#, Packt Publishing

Externe Links