F# – Funktionale und objektorientierte Programmierung auf .NET

F# ist eine Multi-Paradigmen-Sprache auf der .NET-Plattform: Sie kombiniert funktionale Programmierung (unveränderliche Daten, Funktionen als Werte) mit Objektorientierung und Imperativem Stil, wenn es nötig ist. Entwickelt bei Microsoft Research, eignet sich F# besonders für Datenanalyse, wissenschaftliches Rechnen und Domain-Driven Design – und sie läuft überall, wo .NET läuft (Windows, Linux, macOS).

Die wichtigsten F#-Befehle

  • dotnet new console -lang F# – erzeugt ein neues F#-Konsolenprojekt.
  • dotnet new classlib -lang F# – erzeugt eine F#-Bibliothek.
  • dotnet run – baut und startet das Projekt.
  • dotnet build – kompiliert ohne zu starten; dotnet test führt Tests aus.
  • dotnet fsi – startet die F# Interactive REPL.
  • dotnet add package FSharp.Data – fügt ein NuGet-Paket hinzu.
  • dotnet publish -c Release – erzeugt ein Release-Deployment.

Grundkonzepte

  • Let-Bindings: let x = 42 bindet einen Namen an einen Wert. Alles ist ein Ausdruck, der einen Wert liefert.
  • Unveränderlichkeit: Standardmäßig sind Werte unveränderlich (let mutable macht sie änderbar).
  • Pipelines: Der Pipe-Operator |> reicht Daten von links nach rechts durch Funktionen: values |> List.map f |> List.sum.
  • Pattern Matching: match zerlegt Werte und ersetzt längere if-else-Ketten.
  • Discriminated Unions: eigener Typ für klar definierte Alternativen – ideal für Domain-Modelle.

Beispiel: Fibonacci mit Pattern Matching

let rec fib n =
    match n with
    | 0 -> 0
    | 1 -> 1
    | n -> fib (n - 1) + fib (n - 2)

[ 0 .. 10 ] |> List.map fib |> printfn "%A"

F# vs. C#

Wo C# bei großen Enterprise-Anwendungen und Frameworks dominiert, punktet F# mit knapper, ausdrucksstarker Syntax und typsicheren Domain-Modellen. Beide Sprachen teilen dieselbe Laufzeit – F#-Code kann C#-Bibliotheken direkt nutzen und umgekehrt.

Weiterführend: Haskell: Pure Functional Programming und R für Datenanalyse.