7 Punkte von GN⁺ 2025-04-03 | 1 Kommentare | Auf WhatsApp teilen
  • F# ist eine funktionale Sprache aus der ML-Familie, die auf .NET abzielt und von Microsoft entwickelt wurde. Im Vergleich zu dem überwiegend objektorientierten C# konzentriert sich F# auf das funktionale Programmierparadigma
  • Dieser Artikel fasst die Spracheigenschaften von F#, das Ökosystem, den Stand der Dokumentation, Entwicklungstools, Anwendungsfälle, den Zustand der Community und F# vs. OCaml zusammen

Was ist F#?

  • F# ist eine universelle Programmiersprache, um kompakten, robusten und performanten Code zu schreiben
  • Sie wurde so entworfen, dass man sich nicht mit komplexer Syntax aufhalten muss, sondern sich auf die eigentliche Problemlösung konzentrieren kann
  • Sie ist Open Source, plattformübergreifend und hochkompatibel mit .NET
  • Merkmale

    • Leichte Syntax und standardmäßige Unveränderlichkeit
    • Typinferenz und Generalisierung
    • First-Class-Funktionen, starke Datentypen und Pattern Matching
    • Unterstützung für asynchrone Programmierung (Async)
    • Ursprüngliche Sprache des bekannten Pipeline-Operators (|>)
  • Einfaches Beispiel

    open System  
    let names = [ "Peter"; "Julia"; "Xi" ]  
    let getGreeting name = $"Hello, {name}"  
    names |> List.map getGreeting |> List.iter (printfn "%s")  
    
  • F# begann 2005 als von Don Syme bei Microsoft Research entwickelte Sprache
    • Ausgangspunkt war ein Forschungsprojekt, um OCaml auf die .NET-Plattform zu portieren (Caml.NET)
    • Ab 2010 wurde es in das reguläre Produkt aufgenommen, und 2024 erschien F# 9.0
    • Stand 2025 ist es eine gereifte Sprache, die ihr 20-jähriges Jubiläum erreicht hat
  • Hauptgründe, F# auszuprobieren
    • Nachvollziehen, wie sich .NET zu Open Source und einer plattformübergreifenden Plattform entwickelt hat
    • Vergleich der Vor- und Nachteile gegenüber OCaml
    • Positive Einschätzung des Toolings wie Rider und Ionide
    • Einfaches Interesse an der Erkundung einer Sprache

F# als Sprache

  • F# ist eine funktionale Sprache aus der ML-Familie und hat für OCaml-Nutzer eine vertraute Syntax
  • Auch Entwickler mit Erfahrung in Haskell oder Lisp finden sich leicht zurecht
  • Die Syntax ist whitespace-basiert; wie in Python ist Einrückung grammatikalisch wichtig
  • Die Sprache wurde so entworfen, dass auch Einsteiger die Grundsyntax schnell lernen können
  • Zusammenfassung der Spracheigenschaften

    • Funktionsdefinition und -anwendung lassen sich kompakt und natürlich ausdrücken
    • Bedingungen, Schleifen, Tupel und Listenverarbeitung lassen sich im funktionalen Stil sauber verwenden
    • Mit Records, Varianten (Discriminated Unions) und Pattern Matching lassen sich komplexe Datenstrukturen kompakt behandeln
    • Mit dem Pipeline-Operator (|>) lässt sich der Datenfluss visuell klar wie eine Verkettung von Funktionen aufbauen
    • F# eignet sich hervorragend für ad-hoc-Skripte; sie lassen sich als .fsx-Datei schreiben und direkt mit dotnet fsi ausführen
    • Eine REPL-Umgebung ist ebenfalls vorhanden und eignet sich gut für exploratives Programmieren
  • Benutzerfreundliche Syntax

    • Enthält praktische Syntaxfunktionen wie ein- und mehrzeilige Kommentare, mutable-Variablen und List-Slices
    • Dank der hohen Kompatibilität mit C# lassen sich .NET-APIs leicht verwenden
    • Auch Operator-Overloading für verschiedene Typen wird natürlich unterstützt
    • Mit printfn lassen sich verschiedene Typen bequem ausgeben, was für Debugging und Logging nützlich ist
  • Pionier der asynchronen Programmierung

    • Das async/await-Muster hat seinen Ursprung in F# 2.0 und beeinflusste später viele andere Sprachen wie C# und JavaScript
    • F# bietet eine Struktur, mit der sich asynchrone Programmierung intuitiv ohne Callbacks umsetzen lässt
    • Der Code liest sich wie synchroner Ablauf, läuft aber tatsächlich asynchron
  • Microsofts Investitionen und die Weiterentwicklung der Sprache

    • Microsoft stellte F# lange Zeit nur begrenzte personelle Ressourcen zur Verfügung, begann aber 2022 mit einem dedizierten Team in Prag ernsthaft zu investieren
    • Mit den Releases von F# 8.0 und 9.0 werden Sprache und Tooling schnell verbessert
    • Da das interne Interesse bei Microsoft wächst, darf man auch Potenzial für die künftige Entwicklung erwarten

F# ist eine praktische Sprache, die leicht zu lernen ist und zugleich ein starkes Typsystem sowie das funktionale Programmierparadigma mitbringt. Besonders für Entwickler, die in .NET-basierten Projekten einen funktionalen Ansatz einführen möchten, ist sie eine sehr attraktive Wahl

Ökosystem (Ecosystem)

  • Nach relativ kurzer Nutzung zeigt sich, dass es nicht viele reine F#-Bibliotheken oder -Frameworks gibt
  • Die meisten Nutzer verlassen sich auf die Basis-APIs von .NET und Drittanbieterbibliotheken, die vor allem für C# entworfen wurden
  • Das ist ein häufiges Phänomen bei Host-Sprachen (hosted languages) wie Scala, Clojure oder Groovy
  • Wichtige Bibliotheken für Webentwicklung

    • Giraffe: leichtgewichtiges Web-Framework auf Basis von ASP.NET Core mit funktionalem Stil
    • Suave: einfaches Webserver-Framework im Kombinator-Stil für Routing und Task-Komposition
    • Saturn: MVC-artiges Framework auf Basis von Giraffe, inspiriert von Ruby on Rails und Phoenix
    • Bolero: Framework für die Entwicklung von Client-Anwendungen auf Basis von WebAssembly und Blazor
    • Fable: transpiliert F# nach JavaScript und ermöglicht die Anbindung an das JS-Ökosystem wie React oder Node.js
    • Elmish: mit Fable häufig genutztes UI-Framework auf Basis des MVU-Musters (Model-View-Update)
    • SAFE Stack: End-to-End-Stack für funktionale Webentwicklung aus Saturn, Fable, Elmish, Azure usw.
  • Wichtige Bibliotheken für Data Science

    • Deedle: Bibliothek für Datenanalyse und -manipulation im pandas-Stil
    • DiffSharp: mathematisch ausgerichtete Bibliothek für Machine Learning und automatische Differenzierung
    • FsLab: integriertes Toolkit für Data Science mit Visualisierung, Statistikwerkzeugen usw.

Stand der Dokumentation

Entwicklungstools (Dev Tooling)

  • Das Ökosystem der Entwicklungstools für F# war früher praktisch nur für Visual Studio optimiert, während andere Editoren schlecht unterstützt wurden
  • Glücklicherweise hat sich die Tool-Landschaft in den vergangenen zehn Jahren stark verbessert
  • Technischer Wendepunkt: FSharp.Compiler.Service (FCS)

    • FCS ist eine einzelne Bibliothek, die F#-Compiler, Editor-Unterstützung und eine Scripting-Engine umfasst und F# in verschiedenen Editoren und Tooling-Umgebungen nutzbar macht
    • Dadurch wurde F#-Support in VS Code, Dokumentationsgeneratoren und alternativen Backends möglich, was das Ökosystem erweitert hat
    • Ein repräsentatives Beispiel ist Ionide, das in VS Code umfangreiche F#-Unterstützung bietet und über 1 Million Downloads erreicht hat
  • Getestete Editoren

    • Emacs (fsharp-mode): grundlegende Funktionen, keine TreeSitter-Unterstützung, geringe Entwicklungsaktivität
    • Zed: begrenzte F#-Unterstützung
    • Helix: Grundunterstützung vorhanden
    • VS Code (Ionide-Plugin): eine der ausgereiftesten Umgebungen
    • JetBrains Rider: kommerzielle IDE, aber mit sehr starker F#-Unterstützung

    Die meisten Funktionen basieren auf dem F#-Sprachserver (fsautocomplete), daher lässt sich jeder Editor mit guter LSP-Unterstützung verwenden

  • Schwachpunkte

    • fsharp-mode basiert auf einer alten Codebasis und entwickelt sich nur langsam weiter
    • Zed hat zu wenig Funktionen
    • In VS Code funktionieren einige Features (z. B. Auswahl erweitern/verkleinern) nicht richtig
    • Manche Nutzer empfinden VS Code wegen Keybindings oder des modalen Modells als unbequem
  • Code-Formatter und Linter

    • Fantomas: offizieller Code-Formatter für F#, von den meisten Nutzern und Teams verwendet
    • FSharpLint: war einmal populär, ist inzwischen aber faktisch eingestellt
    • Dank des starken Compilers ist die Abhängigkeit von Lintern jedoch gering
  • Weitere Tools

    • Paket: Abhängigkeitsmanager für .NET (ähnlich wie npm, pip, bundler)
    • FAKE: DSL zum Schreiben von Build-Skripten in F#, ähnlich zu rake in Ruby

Anwendungsfälle (Use Cases)

  • Dank des breiten .NET-Ökosystems kann F# in vielen Bereichen eingesetzt werden
  • Besonders wegen der Funktion Type Providers eignet es sich sehr gut für Datenanalyse und Datenmanipulation
  • Es ist auch für Backend-Services und die Entwicklung von Full-Stack-Anwendungen geeignet, und einige Tools ermöglichen sogar Frontend-Entwicklung
  • Zentrale Einsatzgebiete

    • Datenanalyse: Mit den Type Providers von F# ist datenbezogene Verarbeitung auf Basis statischer Typen möglich
    • Backend-Services: F# kann zusammen mit den starken Web-Frameworks von .NET verwendet werden
    • Frontend-Apps: Über Fable und Elmish ist UI-Entwicklung mit Integration ins JS-Ökosystem möglich
      • Seit Fable 4 ist auch die Transpilierung in verschiedene Sprachen wie TypeScript, Rust und Python möglich
  • Fable-Beispiele (einfache Transpilierungsbefehle)

    • JavaScript:
      dotnet fable
    • TypeScript:
      dotnet fable --lang typescript
    • Python:
      dotnet fable --lang python

Zustand der Community

  • Insgesamt ist die Community nicht groß und möglicherweise sogar kleiner als die von OCaml
  • Reddit und Discord sind die aktivsten Kommunikationsräume
  • Es gibt auch eine Slack-Community, doch der Zugang ist wegen Problemen mit dem automatisierten Einladungssystem schwierig
  • Microsofts Rolle innerhalb der Community ist unklar, die Community ist eher stark selbstorganisiert
  • Wichtige von der Community betriebene Ressourcen

Popularität und Realität (The Popularity Contest)

  • F# steht in den meisten Popularitätsmetriken (TIOBE, Stack Overflow, Stellenanzeigen usw.) nicht weit oben
  • Das ist jedoch auch die Realität, in der sich die meisten funktionalen Sprachen befinden, und kein Problem, das nur F# betrifft
  • Es ist weiterhin keine Mainstream-Sprache, hat aber eine Nutzerschaft auf ähnlichem Niveau wie andere funktionale Sprachen wie Clojure, OCaml oder Emacs Lisp
  • Warum F# verwenden?

    • Auch jenseits der Jobchancen gibt es viele Gründe, eine Programmiersprache zu wählen
      • Aus Spaß (es heißt sogar manchmal, das F in F# stehe für „Fun“)
      • Um neue Paradigmen und Ideen zu lernen
      • Um aus vertrauten Denkmustern auszubrechen und andere Denkweisen zu trainieren
  • Verwandte Materialien

Vergleich F# vs. OCaml

Das ursprüngliche Ziel von F# war es, die Vorteile von OCaml zu .NET und die Vorteile von .NET zu OCaml zu bringen
– Don Syme, der Schöpfer von F#

  • F# wurde inspiriert von OCaml entwickelt und war anfangs so ähnlich, dass sogar die Dateiendungen .ml und .mli unterstützt wurden
  • Mit der Zeit entwickelte es sich immer stärker zu einer eigenständigen Sprache, und inzwischen gehen beide ihre eigenen Wege
  • Vorteile von F#

    • Basiert auf der .NET-Plattform
      • Zugriff auf eine riesige Zahl von Bibliotheken
    • Unterstützung durch Microsoft
    • Einsteigerfreundlich
      • Vertraute Syntax für Nutzer objektorientierter Sprachen (wie C#)
      • Fehlermeldungen des Compilers sind vergleichsweise klar
      • Das Debugging wirkt intuitiver
    • Starke Unterstützung für asynchrone Programmierung
    • Bietet Funktionen, die OCaml nicht hat
      • anonyme Records
      • Active Patterns
      • Computation Expressions
      • Sequence Comprehensions
      • Type Providers
      • Units of Measure
  • Nachteile von F#

    • Basiert auf der .NET-Plattform
      • Beim Sprachdesign gibt es viele Kompromisse zugunsten der Interoperabilität mit .NET (z. B. die Zulassung von null)
    • Im Besitz von Microsoft
      • Die Haltung zu Microsoft fällt unterschiedlich aus
      • F# werden vergleichsweise wenige Ressourcen zugewiesen
      • Wie stark Microsoft F# langfristig unterstützen wird, bleibt unklar
    • Probleme rund um den Namen
      • Wer PascalCase- und camelCase-Namenskonventionen nicht mag, könnte das störend finden
      • Der Name F# kann bei Suche oder Dateinamen Probleme verursachen (deshalb wird oft auch FSharp geschrieben)
    • Fehlende fortgeschrittene Features aus OCaml
      • First-Class-Module, Funktoren
      • unzureichende GADT-Unterstützung
    • Kein Maskottchen und kein Kamel
  • Gemeinsamkeiten und Vergleich

    • Beide Sprachen können auf JavaScript-Runtimes abzielen
      • F#: Fable
      • OCaml: js_of_ocaml, Melange
    • Aktuell wirkt Fable ausgereifter, auch wenn dafür mehr Praxiserfahrung nötig ist
    • Beides sind starke, aber nischige Sprachen, und auf absehbare Zeit werden sie vermutlich keine breit populären Sprachen
    • F# hat den praktischen Vorteil, sich schrittweise in bestehende C#-Codebasen einschleusen zu lassen
    • Ein Nachteil ist, dass F#-Projekte weiterhin XML-basierte Projektdateien verwenden und die Kompilierreihenfolge manuell festgelegt werden muss
      • Im Vergleich zu OCamls Build-System Dune kann das umständlich wirken
    • Für Bildungszwecke oder zum Lernen von Sprachstrukturen kann OCaml besser geeignet sein
    • Für praktische Webservices oder Backend-Entwicklung könnte F# die bessere Wahl sein
    • Gerade als Sprache, die sich gut in .NET integriert und dennoch einen funktionalen Stil beibehält, ist F# ein sehr starkes Werkzeug

Abschließende Eindrücke

  • Der Autor empfand F# als deutlich interessanter und praktischer als erwartet
    • Er beschreibt das Gefühl als ähnlich wie beim ersten Kontakt mit Clojure in der Vergangenheit
    • Insbesondere erinnert ihn das daran, dass Clojure dank seiner hervorragenden Interoperabilität mit Java der praktischste Lisp war
  • Wenn .NET von Anfang an Open Source und portabel gewesen wäre,
    • hätte ClojureCLR womöglich deutlich mehr Popularität erreicht
    • und die Community und das Ökosystem von F# wären wohl stärker gewachsen
  • Dass F# bis 2010 nicht Open Source war, behinderte ebenfalls die frühe Verbreitung

„Dass sowohl .NET als auch F# anfangs nicht Open Source waren, war der größte Fehler, und dadurch gingen viele Chancen verloren“ – Don Syme

  • Auch OCaml ist nicht schwer zu lernen, aber für Menschen, die erstmals eine Sprache aus der ML-Familie lernen, könnte F# einfacher sein
    • Auch die Einstiegshürde bis zur Produktion ist niedriger
  • Besonders für Entwickler mit .NET-Erfahrung lohnt es sich unbedingt, F# auszuprobieren
    • F# ist nicht nur als eigenständige Sprache hervorragend, sondern eröffnet auch den Zugang zum starken .NET-Ökosystem
  • Mit Tools wie Fable lässt sich F#-Code nach JavaScript, Dart, Rust, Python usw. transpiliert ausgeben
  • In der F#-Community gibt es den Spruch, „das F in F# steht für Fun“
    • Der Autor fand nach eigener Nutzung, dass das tatsächlich stimmt, und betont, dass es nicht nur Spaß macht, sondern auch praktisch ist
  • Zum Schluss wird auch die Stabilität und Zuverlässigkeit von F# erwähnt: „Wenn es kompiliert, funktioniert es meistens“

In sane type systems we trust!

1 Kommentare

 
GN⁺ 2025-04-03
Hacker-News-Kommentare
  • F# war die beste funktionale Sprache, um eine Ruby-on-Rails-App neu zu schreiben

    • Haskell, Ocaml, Scala und F# wurden in Betracht gezogen
    • Ich war mit Microsoft-Technologien nicht vertraut, aber F# wurde zur ersten Wahl
    • Haskell war wegen seiner Purität schwer zu übernehmen, und das Ökosystem von Ocaml war zu schwach
    • Scala wirkte komplex
    • Mit F# war der Einstieg leicht, und die Community war freundlich, klug und hilfsbereit
    • Es gibt ein hervorragendes Ökosystem mit Zugriff auf .NET-Bibliotheken
    • Es gibt großartige Bibliotheken und Frameworks wie FsHttp, mit denen man leicht mit HTTP-Servern interagieren kann
    • WebSharper war das beste Web-Framework im gesamten Ökosystem
    • Die Tools sind nicht im bestmöglichen Zustand, aber die Begeisterung für die Sprache ist groß
  • Ich habe F# ausprobiert, war aber neu im .NET-Ökosystem

    • Ich war überrascht, dass für ein "Hello World" viele Projektdateien und viel Boilerplate erzeugt wurden
    • Ich unterstütze FP, Unveränderlichkeit und moderne Sprachen, aber es gibt nur wenige Jobs
    • Es gibt eine Tendenz, Sprachen zu bevorzugen, die sich leicht mit KI nutzen lassen
    • In Indien war die Situation noch schlechter, aber in der EU kann man mit Java/TypeScript nachhaltig seinen Lebensunterhalt verdienen
    • Mit Kotlin + TypeScript ist es schwer, gut bezahlte Jobs zu finden
  • Unser Unternehmen ist vor 6 Jahren von C# auf F# umgestiegen

    • Der Umstieg von Sprachen im C-Stil ist schwierig, aber lohnenswert
    • Die Kompilierung ist langsam, und Hot Reload wird nicht unterstützt
    • Es gibt nur wenige Gelegenheiten, es professionell einzusetzen
    • Es kann schwierig sein, Entwickler einzustellen
  • Der Grund, warum die Verbreitung von F# stagniert, ist ein schlechtes Build-System

    • Rust ist eine großartige Sprache, eignet sich aber nicht für viele Problemfelder
    • Ein Grund, sich für Rust zu entscheiden, ist das Build-System
    • Selbst Sprachen mit gemeinnützigen Stiftungen und Unterstützung durch mehrere Unternehmen haben immer noch schlechte Build-Systeme
  • Ich habe F# 2013 gelernt und hatte viel Spaß damit

    • Die User Experience war nicht gut
    • Es gab Probleme mit Namenskonventionen, dem Stil von Funktionsaufrufen, der Grundsyntax, Funktionen des Typsystems und der IDE-Unterstützung
    • Ich bin zu Scala gewechselt, und es fühlte sich konsistenter an als F#
    • F# war meine erste funktionale Sprache und hat meine Sicht auf das Programmieren verändert
  • F# ist ein seltener Fall, bei dem alle Nutzer sehr zufrieden zu sein scheinen

    • Ich bin mit dem .NET-Ökosystem vertraut, deshalb scheint es leicht zu erlernen zu sein
    • Ich frage mich, welche Workflows davon am meisten profitieren könnten
  • Da C# viele Funktionen von F# übernimmt, werden die Vorteile von F# kleiner

    • Ich schreibe C#-Code meist in einem funktionalen Stil, habe aber den Vorteil, Bibliotheken auf die vorgesehene Weise nutzen zu können
  • Es gibt ein profitables SaaS, das vollständig in F# geschrieben ist

    • 3dpack.ing
    • Ein in F# geschriebener Rust-Raytracer wird zu WebAssembly kompiliert
    • fable-raytracer
  • F# ist eine großartige Sprache

    • Selbst wenn man keine einzige Zeile damit schreibt, ist sie eine großartige Beispielsprache
    • Ich verweise oft auf fsharpforfunandprofit.com
  • F# ist schön, aber es war schwer, es fließend zu beherrschen

    • Ich kannte C# nur ein wenig, daher war es schwer, die objektorientierte Herangehensweise von F# zu verstehen
    • Dasselbe Problem hatte ich auch mit Clojure und Scala
    • Ich möchte nicht erst C# oder Java lernen