
Mark Seemann’s September 8 essay shows why F# is technically superior to C# along most software-engineering dimensions, from feature supersets to compiler-enforced directed acyclic graphs.

unsafe and specific tooling integrations. The F#-only complement contains language-level architecture enforcement and monadic syntax that C# still lacks. 1<ItemGroup>
<Compile Include="Domain.fs" />
<Compile Include="Validation.fs" />
<Compile Include="Storage.fs" />
<Compile Include="Api.fs" />
</ItemGroup>Storage.fs can reference Domain.fs and Validation.fs, while code inside Domain.fs cannot reference Storage.fs. If a developer attempts to call a function from a later file, the compiler emits an unresolved identifier error. Circular dependencies between files fail to compile unless developers explicitly opt into mutual recursion with the rec keyword on specific types or modules. 1"Since C# is object-oriented, F# has object-oriented language features too. Since C# is heavily biased towards state mutation, F# supports imperative programming. Since C# supports method overloading, F# does that, too. And so on. F#, however, never stopped at feature parity. It enables you to do more than C# can do."— Mark Seemann, "Worse is better: C# versus F#"
"Even though C# seems to be catching up, I'd be surprised if it ever gets one of F#'s killer features: That it by default disallows circular dependencies. This language feature is often seen as an annoyance, but in reality elevates F# to a language that has built-in software-architecture support."— Mark Seemann, "Worse is better: C# versus F#"
"F# enables this kind of control at the language level. To a software architect, this feature alone is priceless."— Mark Seemann, "Worse is better: C# versus F#"
blog.ploeh.dk
learn.microsoft.com
learn.microsoft.com
devblogs.microsoft.com
stryker-mutator.io
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.