- Warum F# 9 wichtig ist: F# 9 führt umfassende Verbesserungen ein, die Programme sicherer, robuster und leistungsfähiger machen
Nullable-Referenztypen
- F# wurde so entworfen, dass
null vermieden wird, aber bei der Interaktion mit in C# geschriebenen .NET-Bibliotheken kann null dennoch vorkommen
- F# kann Referenztypen, bei denen
null ein gültiger Wert ist, jetzt typsicher behandeln
- Beispiele:
let notAValue: string | null = null
let len (str: string | null) = match str with | null -> -1 | NonNull s -> s.Length
.Is*-Properties für Discriminated Unions
- Discriminated Unions erhalten jetzt für jeden Case automatisch generierte Properties
- Damit lässt sich prüfen, ob ein Wert einem bestimmten Case entspricht
- Zum Beispiel ist nun
person.contact.IsEmail möglich
Partielle aktive Muster können statt unit option einen bool zurückgeben
- Bisher gaben partielle aktive Muster bei einem Treffer
Some (), andernfalls None zurück
- Jetzt können sie auch einen
bool zurückgeben
Erweiterungsmethoden werden bevorzugt, wenn Argumente übergeben werden
- F# löst jetzt Erweiterungsmethoden auf, die denselben Namen haben wie eingebaute Properties eines Typs
- Das entspricht einem Muster, das in einigen .NET-Bibliotheken zu finden ist
Unterstützung für leere Computation Expressions
- F# unterstützt jetzt leere Computation Expressions
- Beispiel:
let xs = seq { }
- Dabei wird die
Zero-Methode des Builders aufgerufen
Hash-Direktiven erlauben nun nicht-stringbasierte Argumente
- Hash-Direktiven für den Compiler akzeptierten bisher nur String-Argumente in Anführungszeichen
- Jetzt können sie Argumente aller Typen annehmen
- Beispiel:
#nowarn 0070
Erweiterte #help-Direktive in fsi
- Die
#help-Direktive in F# Interactive zeigt jetzt die Dokumentation für ein angegebenes Objekt oder eine Funktion an
- Die Übergabe ist ohne Anführungszeichen möglich
- Beispiel:
#help List.map;;
#nowarn unterstützt den Präfix FS beim Deaktivieren von Warnungen
- Bisher erschien bei
#nowarn "FS0057" die Meldung, die Warnungsnummer sei ungültig
- Jetzt werden Warnungsnummern auch mit Präfix akzeptiert
Warnung bei Verwendung des Attributs TailCall auf nicht rekursiven Funktionen oder mit let gebundenen Werten
- F# gibt nun eine Warnung aus, wenn das Attribut
[<TailCall>] an einer ungeeigneten Stelle verwendet wird
- Das hat keine Auswirkungen auf den Code, kann Leserinnen und Leser aber verwirren
Anwendung von Attributzielen
- Der Compiler wendet
AttributeTargets jetzt korrekt auf let-Werte, Funktionen, Union-Case-Deklarationen, implizite Konstruktoren, Structs und Klassen an
- Das kann Fehler verhindern, etwa wenn bei Xunit-Tests versehentlich ein
unit-Argument fehlt
Updates der Standardbibliothek
Random-Funktionen für Collections
- Den Modulen
List, Array und Seq wurden neue Funktionen für zufälliges Sampling und Shuffling hinzugefügt
- Versionen mit einer impliziten, threadsicheren gemeinsam genutzten
Random-Instanz
- Versionen, die eine
Random-Instanz als Argument erhalten
- Versionen, die eine benutzerdefinierte
randomizer-Funktion erhalten
- Verfügbar sind die Funktionen
Shuffle, Choice, Choices und Sample
Parameterloser Konstruktor für CustomOperationAttribute
- Damit lassen sich benutzerdefinierte Operationen für Computation-Expression-Builder einfacher erstellen
- Ein expliziter Name ist nicht mehr nötig, da er in den meisten Fällen dem Methodennamen entspricht
Unterstützung von C#-Collection-Expressions für F# List und Set
- F#
List und Set lassen sich bei der Verwendung aus C# jetzt mit Collection-Expressions initialisieren
- Beispiel:
FSharpSet<int> mySet = [ 1, 2, 3 ];
Höhere Entwicklerproduktivität
Parser-Recovery
- Die Parser-Recovery wurde kontinuierlich verbessert
- Tools funktionieren dadurch weiter, auch wenn Code während der Bearbeitung vorübergehend syntaktisch nicht korrekt ist
Diagnosen
- F# 9 enthält viele neue oder verbesserte Diagnosemeldungen
- Etwa bei mehrdeutigen Override-Methoden, der Verwendung abstrakter Member oder Unions mit doppelten Feldern
Reale Sichtbarkeit
- Die Art, wie F# Assemblies erzeugt, hatte das Problem, dass
private-Member im IL als internal geschrieben wurden
- Dieses Verhalten lässt sich jetzt mit dem Compiler-Flag
--realsig+ korrigieren
Performance-Verbesserungen
Optimierte Gleichheitsprüfungen
- Gleichheitsprüfungen sind jetzt schneller und verursachen weniger Speicherallokationen
Gemeinsame Feldnutzung bei Struct-Discriminated-Unions
- Wenn mehrere Cases eines Struct-DU Felder mit demselben Namen und Typ haben, können sie dieselbe Speicherstelle gemeinsam nutzen
- Das reduziert den Speicherbedarf des Structs
Optimierung von Integer-Bereichen
- Der Compiler erzeugt jetzt für mehr Fälle der Ausdrücke
start..finish und start..step..finish optimierten Code
- Früher wurde nur optimiert, wenn der Typ
int/int32 war und der Schritt den konstanten Wert 1 oder -1 hatte
- Jetzt werden alle Integer-Typen sowie andere Schrittwerte optimiert
Optimierung von for x in xs -> ... in List-/Array-Comprehensions
for x in xs -> ... wurde in Comprehensions für List und Array optimiert
- Besonders bei
Array ergibt das bis zu 10-fache Geschwindigkeit und eine Reduktion der Allokationen auf etwa ein Drittel bis ein Viertel
Verbesserungen bei den Tools
Live Buffer in Visual Studio
- Zuvor war dies eine Opt-in-Funktion, jetzt ist sie standardmäßig aktiviert
- Der Hintergrund-Compiler der IDE arbeitet nun mit dem Live-Dateipuffer
- Es ist nicht mehr nötig, Dateien auf der Festplatte zu speichern, um Änderungen zu übernehmen
Analyzer und Codefix zum Entfernen unnötiger Klammern
- Zusätzliche Klammern werden manchmal zur besseren Lesbarkeit verwendet, sind aber oft nur Rauschen
- Visual Studio bietet jetzt einen Codefix zum Entfernen solcher Klammern
Unterstützung für benutzerdefinierte Visualizer für F# in Visual Studio
- Die Debugger-Visualizer von Visual Studio funktionieren jetzt auch in F#-Projekten
Anzeige von Signatur-Tooltips mitten in einer Pipeline
- Bisher wurde keine Signaturhilfe angeboten, wenn bei einer Funktion mitten in einer Pipeline bereits komplexe curryte Parameter wie Lambdas angewendet waren
- Jetzt wird ein Signatur-Tooltip für den nächsten Parameter angezeigt
1 Kommentare
Hacker-News-Kommentare
F# ist seit meiner ersten Begegnung damit im Studium meine Lieblingssprache. Sie hat Features, die C# voraus waren, und obwohl C# solche Features ebenfalls übernimmt, gibt es dabei Schwierigkeiten wegen der Kompatibilität. F# ist weiterhin eine großartige Sprache, mit dem .NET-Ökosystem kompatibel und kann mit wenig Boilerplate eine mit C# vergleichbare Performance liefern
F# ist eines der besten Produkte, die Microsoft seit Excel veröffentlicht hat, und macht .NET zu einer vernünftigen Plattform
Ich habe stark in das auf F# basierende Projekt Phosphor investiert, es dann aber komplett in Typescript und Rust neu geschrieben. Über die Fable-Bibliothek wollten wir Typsicherheit über verschiedene Technologien hinweg erhalten, aber es gab Probleme bei der Interoperabilität zwischen Bibliotheken und die Verwaltung der Abhängigkeiten war schwierig. Ich denke, F# eignet sich nur dann gut, wenn es eine klassische Trennung zwischen Frontend und Backend gibt
In einem Kryptografie-Kurs, in dem man eine .NET-Sprache frei wählen konnte, waren die in F# geschriebenen Aufgaben leichter lesbar als die der anderen. Da fast 100 % der Data-Science-Arbeit in Python passiert, konnte ich F# nicht häufiger einsetzen
Ich vermisse die Arbeit mit F#, verfolge aber weiterhin die Updates. Die Tools waren trotz der kleinen Community und des mangelnden Interesses von Microsoft ziemlich gut. Das größte Problem war die Genauigkeit der Code-Testabdeckung
Ich habe vor Kurzem F# ausprobiert und als jemand, der von Python kommt, gefällt mir, dass man ein REPL nutzen kann. Im Winter möchte ich ein kleines Web-Backend-Projekt bauen, um die Sprache und das Ökosystem besser kennenzulernen. Über Oxpecker habe ich für den HTTP-Teil Gutes gehört
Ich frage mich, wie das Versionierungsschema von F# funktioniert. Es gibt viele Qualitätsverbesserungen, aber es scheint keinen Bedarf für einen Major-Version-Wechsel zu geben. Ich frage mich, ob die Angleichung der Versionsnummer an .NET 9 der Grund ist
Ich frage mich, wie es um F# als Alternative zu C# für die Entwicklung von GUI-Apps unter Windows steht und ob es Unternehmen gibt, die F# dafür verwenden
Ich habe F# nie ausprobiert, aber ich habe eine Website gefunden, die nach einer guten Ressource aussieht: fsharpforfunandprofit.com
Ich frage mich, wie der Stand von F# unter Linux/MacOS ist. Ist es nur für Windows gedacht oder fühlt es sich wie eine vollständig unterstützte Sprache an?