What's New in F# 9

F# 9’s release prompts renewed comparison between F#, C#, and the broader .NET ecosystem, with many praising F#’s functional features, strong type system, and productivity but noting its small community, weaker tooling history, and limited job market. Commenters highlight how modern .NET (Core) is now cross‑platform, supports minimal APIs, AOT compilation, and strong tooling, yet still suffers from dated perceptions and branding missteps. A recurring theme is that F# remains an excellent language for backend, data-heavy, or correctness‑critical work—often used alongside C#—but its adoption is constrained by ecosystem inertia and management priorities rather than technical shortcomings.

Perception of F#, C#, and .NET

  • Many commenters praise F# as a beautiful, productive, and readable language, especially for backend, algorithms, and data-heavy work.
  • C# is seen as underrated: productive, easy to teach (especially to JS/TS devs), with strong tooling and cross‑platform support.
  • Some criticize “enterprise-style” C# culture (DI-heavy, reflection, complex frameworks like EF/Spring-like stacks) for over‑abstraction and poor readability, while others argue that’s a team/culture issue, not the language.

Ecosystem, Jobs, and Microsoft Support

  • Major F# downside: few jobs, smaller ecosystem, fewer libraries, and less marketing from Microsoft.
  • Some worry about long‑term dependence on Microsoft, though others point to open-source status and the F# Software Foundation.
  • F# is often used in niche or high‑leverage teams inside .NET shops rather than as a widely advertised primary language.

Tooling, Platforms, and Deployment

  • F# works well on Windows, Linux, and macOS via .NET; parity with C# for non‑Windows-specific APIs.
  • Ionide (VS Code) and Rider are cited as strong F# environments; tooling has improved significantly in the last decade.
  • .NET deployment options discussed: shared runtime, self‑contained single binaries, trimming, and NativeAOT (including for F#).

Language Features and Interop

  • F# strengths: discriminated unions, pattern matching, records, type inference, REPL, pipeline operators, and scripting (.fsx).
  • F# 9: nullable reference interop (T | null) to align with C# nullable reference types; some disappointed this introduces null rather than mapping more strictly to options.
  • Async interop between F# async and C# Task is seen as historically painful; newer task computation expressions and helpers improve this but edge cases remain debated.
  • Tail-call attribute and TCO enforcement are welcomed for correctness.

GUI, Web, and WASM

  • GUI options: Avalonia-based libraries, Fabulous, and others; usage in production seems niche.
  • Web frameworks and WASM options (e.g., Bolero) exist; maintenance activity is mixed but still ongoing.

Learning Curve and Experience Reports

  • Functional newcomers (from JS/Python/Go) often adapt well; OO veterans (C#/Java) may need to “unlearn” patterns and initially find F# less discoverable.
  • Some report F# code as easier to read than Python or C#; others find it visually “ugly” or hard to get into.
  • One long case study describes abandoning a large F#/Fable-based system in favor of TypeScript+Rust due to complex multi-target interop and dependency management.