1 Punkte von GN⁺ 2024-11-11 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2024-11-11
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

    • Die interessantesten Technologien, die wir intern derzeit nutzen, sind die Effect-Bibliothek und Moonbit. Moonbit wirkt wie eine moderne Version von F# ohne MS/.NET-Abhängigkeit und scheint eine vielversprechende Sprache für eine KI-zentrierte Welt zu sein
  • 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?