{"id":43191,"date":"2022-11-08T08:58:30","date_gmt":"2022-11-08T15:58:30","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/dotnet\/?p=43191"},"modified":"2022-11-09T09:46:23","modified_gmt":"2022-11-09T16:46:23","slug":"announcing-fsharp-7","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-fsharp-7\/","title":{"rendered":"Announcing F# 7"},"content":{"rendered":"<p>We\u2019re happy to announce the availability of F# 7, shipping with .NET 7 and Visual Studio 2022. Check out this next step to making it easier for you to write robust, succinct and performant code. You can get F# 7 in the following ways:<\/p>\n<ul>\n<li><a href=\"https:\/\/dotnet.microsoft.com\/download\/dotnet\/7.0\">Install the latest .NET 7 SDK<\/a><\/li>\n<li><a href=\"https:\/\/visualstudio.microsoft.com\/vs\/preview\/\">Install Visual Studio 2022 preview<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/interactive#notebooks-with-net\">Use .NET Polyglot Notebooks in Jupyter or VS Code<\/a><\/li>\n<\/ul>\n<p>F# 7 continues the journey to make F# simpler and more performant as well as improving interop with new C# features. <a href=\"#making-working-with-srtps-easier\">Syntax for the F# specific feature SRTP is simplified<\/a>. Support has been added for <a href=\"#static-abstract-members-support-in-interfaces\">Static abstract members support in interfaces<\/a> and consumption of <a href=\"#required-properties-checking\">C# <code>required<\/code> members and <code>init<\/code> scope<\/a>. The F# compiler is improved to offer <a href=\"#reference-assemblies-support\">reference assemblies<\/a>, <a href=\"#other-changes\">trimmability, better code gen, ARM64 support, performance enhancements and bug fixes<\/a>.<\/p>\n<p>To learn more about F#, see <a href=\"https:\/\/dotnet.microsoft.com\/languages\/fsharp\">the .NET guide to F#<\/a> and the excellent overview talks at the <a href=\"https:\/\/channel9.msdn.com\/Events\/dotnetConf\/Focus-on-FSharp\">.NET Conf Focus Day on F#<\/a>. The F# community provide resources through <a href=\"https:\/\/fsharp.org\">the F# Software Foundation (fsharp.org)<\/a>. If you&#8217;re interested in more advanced topics, see <a href=\"https:\/\/www.youtube.com\/c\/FastFSharp\">Fast F#<\/a> series by <a href=\"https:\/\/twitter.com\/FastFSharp\">Matthew Crews<\/a>, the <a href=\"https:\/\/www.youtube.com\/c\/fsharporg\">F# community compiler sessions<\/a>, this interview with F# designer Don Syme (<a href=\"https:\/\/www.youtube.com\/watch?v=hNAb04V4liA&amp;t=1s&amp;ab_channel=ContextFree\">part 1<\/a> \/ <a href=\"https:\/\/www.youtube.com\/watch?v=x4j7LQApfEY&amp;t=25s&amp;ab_channel=ContextFree\">part 2<\/a>) and <a href=\"https:\/\/www.youtube.com\/watch?v=IHoasuxy1C0&amp;ab_channel=Betabit\">Betatalks #66<\/a> .<\/p>\n<p>To stay up to date, check out the community-provided <a href=\"https:\/\/sergeytihon.com\/fsharp-weekly\/\">F# Weekly<\/a>, follow <a href=\"https:\/\/twitter.com\/fsharporg\">@fsharporg<\/a> on Twitter, and join the <a href=\"https:\/\/foundation.fsharp.org\/about\">F# Software Foundation<\/a> to get the latest news and updates.<\/p>\n<h2>Static abstract members support in interfaces<\/h2>\n<p>We are adding a way of declaring, calling and implementing interfaces with static abstract methods, described in <a href=\"https:\/\/github.com\/fsharp\/fslang-design\/blob\/main\/FSharp-7.0\/FS-1124-interfaces-with-static-abstract-members.md\">F# RFC 1124<\/a>.\nThis is a new feature in .NET 7, matching the <a href=\"https:\/\/learn.microsoft.com\/dotnet\/csharp\/whats-new\/tutorials\/static-virtual-interface-members\">corresponding C# feature<\/a>. One notable application is <a href=\"https:\/\/learn.microsoft.com\/dotnet\/csharp\/whats-new\/tutorials\/static-virtual-interface-members#generic-math\">generic math<\/a>.<\/p>\n<p>First, let&#8217;s declare an interface with a static abstract member:<\/p>\n<pre><code class=\"language-fsharp\">type IAddition&lt;'T when 'T :&gt; IAdditionOperator&lt;'T&gt;&gt; =\n    static abstract op_Addition: 'T * 'T -&gt; 'T<\/code><\/pre>\n<blockquote>\n<p><strong>Note<\/strong> The code above will produce <code>FS3535<\/code> warning &#8211; <code>Declaring \"interfaces with static abstract methods\" is an advanced feature. See &lt;https:\/\/aka.ms\/fsharp-iwsams&gt; for guidance. You can disable this warning by using '#nowarn \"3535\"' or '--nowarn:3535'.<\/code><\/p>\n<\/blockquote>\n<p>Next, we can implement it (<code>'T * 'T<\/code> is the F# signature for a function with two parameters of type `T):<\/p>\n<pre><code class=\"language-fsharp\">type IAddition&lt;'T when 'T :&gt; IAddition&lt;'T&gt;&gt; =\n    static abstract op_Addition: 'T * 'T -&gt; 'T\n\ntype Number&lt;'T when IAddition&lt;'T&gt;&gt;(value: 'T) =\n    member _.Value with get() = value\n    interface IAddition&lt;Number&lt;'T&gt;&gt; with\n        static member op_Addition(a, b) = Number(a.Value + b.Value)<\/code><\/pre>\n<p>This will allow us to write generic functions that can be used with any type that implements <code>IAddition<\/code> interface:<\/p>\n<pre><code class=\"language-fsharp\">let add&lt;'T when IAddition&lt;'T&gt;&gt;(x: 'T) (y: 'T) = 'T.op_Addition(x,y)<\/code><\/pre>\n<p>or in the operator form:<\/p>\n<pre><code class=\"language-fsharp\">let add&lt;'T when IAddition&lt;'T&gt;&gt;(x: 'T) (y: 'T) = x + y<\/code><\/pre>\n<p>This is a runtime feature and can be used with any static methods or properties, you can see a few more examples below.<\/p>\n<pre><code class=\"language-fsharp\">type ISinOperator&lt;'T when 'T :&gt; ISinOperator&lt;'T&gt;&gt; =\n    static abstract Sin: 'T -&gt; 'T\n\nlet sin&lt;'T when ISinOperator&lt;'T&gt;&gt;(x: 'T) = 'T.Sin(x)<\/code><\/pre>\n<p>This feature can also be used with BCL built-in types (such as <code>INumber&lt;'T&gt;<\/code>), for example:<\/p>\n<pre><code class=\"language-fsharp\">open System.Numerics\n\nlet sum&lt;'T when INumber&lt;'T&gt;&gt;(values: seq&lt;'T&gt;) =\n    let mutable result = 'T.Zero\n    for value in values do\n        result &lt;- result + value\n    result<\/code><\/pre>\n<p>These simplified examples show how interfaces with static abstract methods work.<\/p>\n<p>This is an advanced feature with potential serious methodological drawbacks if used inappropriately. To learn more about the pros and cons of using the feature in F# methodology, see the <a href=\"https:\/\/github.com\/fsharp\/fslang-design\/blob\/main\/FSharp-7.0\/FS-1124-interfaces-with-static-abstract-members.md#drawbacks\">drawbacks<\/a> and <a href=\"https:\/\/github.com\/fsharp\/fslang-design\/blob\/main\/FSharp-7.0\/FS-1124-interfaces-with-static-abstract-members.md#guidance\">guidance<\/a> sections of the RFC. In particular, you should not use this feature for application code, nor for library code whose specification may be subject to significant change.<\/p>\n<p>Because of the potential drawbacks, we will emit a <a href=\"https:\/\/github.com\/fsharp\/fslang-design\/blob\/main\/FSharp-7.0\/FS-1124-interfaces-with-static-abstract-members.md#warning-when-declaring-iwsams\">warning when interfaces with static abstract methods are declared and implemented in F#<\/a>. Additionally, a warning is emitted when <a href=\"https:\/\/github.com\/fsharp\/fslang-design\/blob\/main\/FSharp-7.0\/FS-1124-interfaces-with-static-abstract-members.md#warning-when-using-iwsams-as-types\">interfaces with static abstract methods are used as types, not type constraints<\/a>. Both these warnings can be suppressed.<\/p>\n<h2>Making working with SRTPs easier<\/h2>\n<p>F# SRTPs or <a href=\"https:\/\/learn.microsoft.com\/dotnet\/fsharp\/language-reference\/generics\/statically-resolved-type-parameters\">Statically Resolved Type Parameters<\/a> are type parameters that are replaced with an actual type at compile time instead of at run time. F# 7 simplifies the syntax used for defining SRTPs through <a href=\"https:\/\/github.com\/fsharp\/fslang-design\/blob\/main\/FSharp-7.0\/FS-1083-srtp-type-no-whitespace.md\">F# RFC 1083<\/a> and <a href=\"https:\/\/github.com\/fsharp\/fslang-design\/blob\/main\/FSharp-7.0\/FS-1124-interfaces-with-static-abstract-members.md\">F# RFC 1124<\/a>. This aligns SRTPs and interfaces with static abstract members and makes it easier to interconvert between these two approaches to generic math.<\/p>\n<p>As a quick refreshment on what SRTPs are, and how they&#8217;re used, let&#8217;s declare a function named <code>average<\/code> that takes an array of type <code>T<\/code> where type <code>T<\/code> is a type that has at least the following members:<\/p>\n<ul>\n<li>An addition operator (<code>(+)<\/code> or <code>op_Addition<\/code>)<\/li>\n<li>A <code>DivideByInt<\/code> static method, which takes a <code>T<\/code> and an <code>int<\/code> and returns a <code>T<\/code><\/li>\n<li>A static property named <code>Zero<\/code> that returns a <code>T<\/code><\/li>\n<\/ul>\n<pre><code class=\"language-fsharp\">let inline average&lt; ^T\n                   when ^T: (static member (+): ^T * ^T -&gt; ^T)\n                   and  ^T: (static member DivideByInt : ^T * int -&gt; ^T)\n                   and  ^T: (static member Zero : ^T)&gt;\n                   (xs: ^T array) =\n    let mutable sum : ^T = (^T : (static member Zero: ^T) ())\n    for x in xs do\n        sum &lt;- (^T : (static member op_Addition: ^T * ^T -&gt; ^T) (sum, x))\n    (^T : (static member DivideByInt: ^T * int -&gt; ^T) (sum, xs.Length))<\/code><\/pre>\n<p><code>^T<\/code> here is a type parameter, and <code>^T: (static member (+): ^T * ^T -&gt; ^T)<\/code>, <code>^T: (static member DivideByInt : ^T * int -&gt; ^T)<\/code>, and <code>^T: (static member Zero : ^T)<\/code> are constraints for it.<\/p>\n<p>We are making some improvements here. First, you no longer need to use a dedicated type parameter character (<code>^<\/code>), a single tick character (<code>'<\/code>) can be used instead, the compiler will decide whether it&#8217;s static or generic based on the context &#8211; whether the function is <code>inline<\/code> and if it has constraints.<\/p>\n<p>Next, we are also adding a new simpler  syntax for calling constraints, which is more readable and easier to write:<\/p>\n<pre><code class=\"language-fsharp\">let inline average&lt;'T\n                when 'T: (static member (+): 'T * 'T -&gt; 'T)\n                and  'T: (static member DivideByInt : 'T * int -&gt; 'T)\n                and  'T: (static member Zero : 'T)&gt;\n                (xs: 'T array) =\n    let mutable sum = 'T.Zero\n    for x in xs do\n        sum &lt;- sum + x\n    'T.DivideByInt(sum, xs.Length)<\/code><\/pre>\n<p>Finally, we&#8217;ve added the ability to declare constraints in groups:<\/p>\n<pre><code class=\"language-fsharp\">type AverageOps&lt;'T when 'T: (static member (+): 'T * 'T -&gt; 'T)\n                   and  'T: (static member DivideByInt : 'T*int -&gt; 'T)\n                   and  'T: (static member Zero : 'T)&gt; = 'T<\/code><\/pre>\n<p>And a simpler syntax for self-constraints, which are constraints that refer to the type parameter itself:<\/p>\n<pre><code class=\"language-fsharp\">let inline average&lt;'T when AverageOps&lt;'T&gt;&gt;(xs: 'T array) =\n    let mutable sum = 'T.Zero\n    for x in xs do\n        sum &lt;- sum + x\n    'T.DivideByInt(sum, xs.Length)<\/code><\/pre>\n<p>The simplified call syntax also works with instance members:<\/p>\n<pre><code class=\"language-fsharp\">type Length&lt;'T when 'T: (member Length: int)&gt; = 'T\nlet inline len&lt;'T when Length&lt;'T&gt;&gt;(x: 'T) =\n    x.Length<\/code><\/pre>\n<p>Together these changes make working with SRTPs easier and more readable.<\/p>\n<h2>Required properties checking<\/h2>\n<p>C# 11 introduced new <a href=\"https:\/\/learn.microsoft.com\/dotnet\/csharp\/language-reference\/keywords\/required\">required modifier for properties<\/a>, F# 7 supports consuming classes with required properties and enforcing the constraint:<\/p>\n<p>Consider the following data type, defined in the C# library:<\/p>\n<pre><code class=\"language-csharp\">public sealed class Person\n{\n    public required string Name { get; set; }\n    public required string Surname { get; set; }\n}<\/code><\/pre>\n<p>When using from F# code, the F# compiler will make sure required properties are getting properly initialized:<\/p>\n<pre><code class=\"language-fsharp\">let person = Person(Name = \"John\", Surname = \"Smith\")<\/code><\/pre>\n<p>The code above will compile correctly, but if we try to omit any of the required properties, we will get a compile-time diagnostic:<\/p>\n<pre><code class=\"language-fsharp\">let person = Person(Name = \"John\")<\/code><\/pre>\n<pre><code class=\"language-fsharp\">FS3545: The following required properties have to be initalized:\n    property Person.Surname: string with get, set<\/code><\/pre>\n<h3>Init scope and init-only properties<\/h3>\n<p>In F# 7 we are tightening the rules for <code>init-only<\/code> properties so that they can only be initialized within the <code>init<\/code> scope. This is a new compile-time check and is a breaking change. It will only be applied starting F# 7, see examples below.<\/p>\n<p>Given the following C# data type:<\/p>\n<pre><code class=\"language-csharp\">public sealed class Person\n{\n    public int Id { get; init; }\n    public int Name { get; set; }\n    public int Surname { get; set; }\n    public Person Set() =&gt; this;\n}<\/code><\/pre>\n<p>Before, in F# 6, the following code would&#8217;ve compiled and mutated the property <code>Id<\/code> of the <code>Person<\/code>:<\/p>\n<pre><code class=\"language-fsharp\">let person = Person(Id = 42, Name = \"John\", Surname = \"Doe\")\nperson.Id &lt;- 123\nperson.set_Id(123)\nperson.Set(Id=123)<\/code><\/pre>\n<p>In F# 7, we are changing this to be a compile-time error:<\/p>\n<pre><code class=\"language-csharp\">Error FS0810 Init-only property 'Id' cannot be set outside the initialization code. See https:\/\/aka.ms\/fsharp-assigning-values-to-properties-at-initialization\nError FS0810 Cannot call 'set_Id' - a setter for init-only property, please use object initialization instead. See https:\/\/aka.ms\/fsharp-assigning-values-to-properties-at-initialization\nError FS0810 Init-only property 'Id' cannot be set outside the initialization code. See https:\/\/aka.ms\/fsharp-assigning-values-to-properties-at-initialization<\/code><\/pre>\n<h2>Reference assemblies support<\/h2>\n<p>Starting F# 7, the F# compiler can generate and properly consume <a href=\"https:\/\/learn.microsoft.com\/dotnet\/standard\/assembly\/reference-assemblies\">reference assemblies<\/a>.<\/p>\n<p>You can generate reference assemblies by:<\/p>\n<ul>\n<li>Adding <code>ProduceReferenceAssembly<\/code> MSBuild project property to your <code>fsproj<\/code> (<code>&lt;ProduceReferenceAssembly&gt;true&lt;\/ProduceReferenceAssembly&gt;<\/code>) file or msbuild flags (<code>\/p:ProduceReferenceAssembly=true<\/code>).<\/li>\n<li>Using <code>--refout<\/code> or <code>--refonly<\/code> compiler options.<\/li>\n<\/ul>\n<p>We are looking forward to your feedback on this feature.<\/p>\n<h2>F# self-contained deployments &amp; Native AOT<\/h2>\n<p>While <a href=\"https:\/\/learn.microsoft.com\/dotnet\/core\/deploying\/trimming\/trim-self-contained\">F# apps can already be trimmed<\/a> and <a href=\"https:\/\/learn.microsoft.com\/dotnet\/core\/deploying\/native-aot\/\">compiled to the native code<\/a> in most cases, we are working on making this experience even better.<\/p>\n<p>In F# 7 we are introducing number of improvements:<\/p>\n<ul>\n<li>A new codegen flag for F# compiler <code>--reflectionfree<\/code> &#8211; it will allow skipping emitting of automatic (<code>%A<\/code>, reflection-based) <code>ToString<\/code> implementation for records, unions and structs.<\/li>\n<li>Trimmabillity improvements for <code>FSharp.Core<\/code> &#8211; added <code>ILLink.LinkAttributes.xml<\/code> and <code>ILLink.LinkAttributes.xml<\/code> for <code>FSharp.Core<\/code>, which allows trimming compile-time resources and attributes for runtime-only FSharp.Core dependency.<\/li>\n<\/ul>\n<p>We will continue to work on improving the experience of F# self-contained deployments and Native AOT for the next version of F# and core library.<\/p>\n<h2>Other changes<\/h2>\n<p>Other changes in F# 7 include:<\/p>\n<ul>\n<li>Added support for N-d arrays up to rank 32.<\/li>\n<li>Result module functions parity with Option.<\/li>\n<li>Fixes in resumable state machines codegen for the tasks builds.<\/li>\n<li>Better codegen for compiler-generated side-effect-free property getters.<\/li>\n<li>ARM64 platform-specific compiler and ARM64 target support in F# compiler. Dependency manager <code>#r<\/code> caching support.<\/li>\n<li>Parallel type-checking and project-checking support (experimental, can be enabled via VS setting, or by tooling authors).<\/li>\n<li>Miscellaneous bugfixes and improvements.<\/li>\n<\/ul>\n<p>RFCs for F# 7 can be found <a href=\"https:\/\/github.com\/fsharp\/fslang-design\/tree\/main\/FSharp-7.0\">here<\/a>.<\/p>\n<h2>General Improvements in .NET 7<\/h2>\n<p>.NET 7 brought a myriad of improvements, which F# 7 will benefit from &#8211; <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/arm64-performance-improvements-in-dotnet-7\/\">various arm64 performance improvements<\/a>, and <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/performance_improvements_in_net_7\/\">general performance improvements<\/a>.<\/p>\n<h2>Thanks and Acknowledgments<\/h2>\n<p>F# is developed as a collaboration between the .NET Foundation, the F# Software Foundation, their members and other contributors including Microsoft. The F# community is involved at all stages of innovation, design, implementation and delivery and we&#8217;re proud to be a contributing part of this community.<\/p>\n<p>Many people have contributed directly and indirectly to F# 7, including all who have contributed to the F# Language Design Process through <a href=\"https:\/\/github.com\/fsharp\/fslang-suggestions\/\">fsharp\/fslang-suggestions<\/a> and <a href=\"https:\/\/github.com\/fsharp\/fslang-design\">fsharp\/fslang-design<\/a> repositories.<\/p>\n<p><a href=\"https:\/\/github.com\/abonie\">Adam Boniecki<\/a>, <a href=\"https:\/\/github.com\/brettfo\">Brett V. Forsgren<\/a>, <a href=\"https:\/\/github.com\/dsyme\">Don Syme<\/a>, <a href=\"https:\/\/github.com\/jonsequitur\">Jon Sequeira<\/a> <a href=\"https:\/\/github.com\/KevinRansom\">Kevin Ransom<\/a>, <a href=\"https:\/\/github.com\/0101\">Petr Pokorn\u00fd<\/a>, <a href=\"https:\/\/github.com\/psfinaki\">Petr Semkin<\/a>, <a href=\"https:\/\/github.com\/T-Gro\">Tom\u00e1\u0161 Gro\u0161up<\/a>, <a href=\"https:\/\/github.com\/vzarytovskii\">Vlad Zarytovskii<\/a>, <a href=\"https:\/\/github.com\/TIHan\">Will Smith<\/a> contributed directly as part of F# team at Microsoft.<\/p>\n<p><a href=\"https:\/\/github.com\/nojaf\">Florian Verdonck<\/a> contributed <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=nojaf&amp;since=2021-10-13&amp;until=2022-10-15\">72 PRs<\/a>, including work on parallel type-checking improvements, tons of improvements to the syntax trees, which benefit <strong>all<\/strong> tooling in general and <a href=\"https:\/\/github.com\/fsprojects\/fantomas#fantomas\">Fantomas<\/a> source code formatter in particular.<\/p>\n<p><a href=\"https:\/\/github.com\/auduchinok\">Eugene Auduchinok<\/a> contributed 26 <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=auduchinok&amp;since=2021-10-13&amp;until=2022-10-15\">PRs<\/a> including a bunch of improvements and optimizations in the parser, IL reading, completions, compiler service caching and more.<\/p>\n<p><strong>Our new contributor<\/strong> <a href=\"https:\/\/github.com\/edgarfgp\">Edgar Gonzalez<\/a> \ud83e\udd73 contributed <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=edgarfgp&amp;since=2021-10-13&amp;until=2022-10-15\">17 PRs<\/a> with tons of improvements and fixes around attributes processing, RequiredQualifiedAccess &amp; lower-cased DU cases relaxations and whole bunch of bugfixes.<\/p>\n<p><a href=\"https:\/\/github.com\/kerams\">kerams<\/a> contributed <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=kerams&amp;since=2021-10-13&amp;until=2022-10-15\">13 PRs<\/a> for records, types, unions, enums, lambda variables completions, IL gen improvements, and more.<\/p>\n<p>Other direct contributors to the <a href=\"https:\/\/github.com\/dotnet\/fsharp\">dotnet\/fsharp<\/a> repository in the F# 7.0 time period include <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=teo-tsirpanis&amp;since=2021-10-13&amp;until=2022-10-15\">teo-tsirpanis<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=DedSec256&amp;since=2021-10-13&amp;until=2022-10-15\">DedSec256<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=baronfel&amp;since=2021-10-13&amp;until=2022-10-15\">baronfel<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=leolorenzoluis&amp;since=2021-10-13&amp;until=2022-10-15\">leolorenzoluis<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=dawedawe&amp;since=2021-10-13&amp;until=2022-10-15\">dawedawe<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=tmat&amp;since=2021-10-13&amp;until=2022-10-15\">tmat<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=marcin-krystianc&amp;since=2021-10-13&amp;until=2022-10-15\">marcin-krystianc<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=cartermp&amp;since=2021-10-13&amp;until=2022-10-15\">cartermp<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=pirrmann&amp;since=2021-10-13&amp;until=2022-10-15\">pirrmann<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=safesparrow&amp;since=2021-10-13&amp;until=2022-10-15\">safesparrow<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=omppye&amp;since=2021-10-13&amp;until=2022-10-15\">omppye<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=Happypig375&amp;since=2021-10-13&amp;until=2022-10-15\">Happypig375<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=ncave&amp;since=2021-10-13&amp;until=2022-10-15\">ncave<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=NinoFloris&amp;since=2021-10-13&amp;until=2022-10-15\">Nino Floris<\/a> <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=thinkbeforecoding&amp;since=2021-10-13&amp;until=2022-10-15\">thinkbeforecoding<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=MichaelSimons&amp;since=2021-10-13&amp;until=2022-10-15\">MichaelSimons<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=tboby&amp;since=2021-10-13&amp;until=2022-10-15\">tboby<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=mmitche&amp;since=2021-10-13&amp;until=2022-10-15\">mmitche<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=nosami&amp;since=2021-10-13&amp;until=2022-10-15\">nosami<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=jonfortescue&amp;since=2021-10-13&amp;until=2022-10-15\">jonfortescue<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=smoothdeveloper&amp;since=2021-10-13&amp;until=2022-10-15\">smoothdeveloper<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=abelbraaksma&amp;since=2021-10-13&amp;until=2022-10-15\">abelbraaksma<\/a>, <a href=\"https:\/\/github.com\/dotnet\/fsharp\/commits?author=uxsoft&amp;since=2021-10-13&amp;until=2022-10-15\">uxsoft<\/a>.<\/p>\n<p>Many other people are contributing to the rollout of F# 7 and .NET 7 in <a href=\"https:\/\/fable.io\/\">Fable<\/a>, <a href=\"https:\/\/ionide.io\/\">Ionide<\/a>, <a href=\"https:\/\/fsbolero.io\/\">Bolero<\/a>, <a href=\"https:\/\/fsprojects.github.io\/FSharp.Data\/\">FSharp.Data<\/a>, <a href=\"https:\/\/github.com\/giraffe-fsharp\/Giraffe#giraffe\">Giraffe<\/a>, <a href=\"https:\/\/github.com\/SaturnFramework\/Saturn\">Saturn<\/a>, <a href=\"https:\/\/safe-stack.github.io\/\">SAFE Stack<\/a>, <a href=\"https:\/\/websharper.com\/\">WebSharper<\/a>, <a href=\"https:\/\/fscheck.github.io\/FsCheck\/\">FsCheck<\/a>, <a href=\"https:\/\/diffsharp.github.io\/\">DiffSharp<\/a>, <a href=\"https:\/\/github.com\/fsprojects\/fantomas#fantomas\">Fantomas<\/a> and other community-delivered technologies.<\/p>\n<h2>What&#8217;s next?<\/h2>\n<p>We will continue working on improving both F# language as well as tooling, including, but not limited to various VS features and improvements, compiler performance, language simplicity, new language features and more. If you&#8217;re interested in following our progress, you <a href=\"https:\/\/github.com\/orgs\/dotnet\/projects\/126\/views\/17\">check out our tracking issues<\/a>. If contributing to the compiler and tooling is something that interests you more, please check out our <a href=\"https:\/\/github.com\/dotnet\/fsharp\/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22help+wanted%22\">&#8220;help wanted&#8221; issues list<\/a>, or feel free to drop a question in <a href=\"https:\/\/github.com\/dotnet\/fsharp\/discussions\">discussions<\/a>.<\/p>\n<h2>Contributor Showcase<\/h2>\n<p>In this and future announcements, we will highlight some of the individuals who contribute to F#. This text is written in the contributors\u2019 own words:<\/p>\n<h3>Edgar Gonzalez<\/h3>\n<blockquote>\n<p>I&#8217;m Edgar Gonzalez, and I live between Albacete(Spain) and London(Uk), where I&#8217;m a Mobile Developer at Fund Ourselves.<\/p>\n<p>I&#8217;m new to the .NET ecosystem. Previously I was a member of the Spanish Paratroopers Brigade &#8220;Almog\u00e1vares&#8221; VI, where I served as a Corporal first class (2004-2017).<\/p>\n<p>I started programming five years ago, interested in mobile development with C#, and around the same time, I was introduced to F# by <a href=\"https:\/\/twitter.com\/praeclarum\">Frank A. Krueger<\/a> using Xamarin.iOS<\/p>\n<p>Last year I moved to F#, and during my journey realized that there is room for improvement regarding compiler error reporting, so I decided to get involved and help make F# simple for newcomers like me.<\/p>\n<p>Why do I like F#? it has a clean and lightweight syntax, is expression-oriented, exhaustive pattern matching, and discriminated unions.<\/p>\n<p>I look forward to continuing to help F# to be even better, focusing on making it easy for newcomers.<\/p>\n<p>Thanks to <a href=\"https:\/\/twitter.com\/Tim_Lariviere\">Timoth\u00e9 Larivi\u00e8re<\/a> and <a href=\"https:\/\/twitter.com\/verdonckflorian\">Florian Verdonck<\/a> for helping me get started with open source.<\/p>\n<\/blockquote>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2022\/11\/EdgarGonzalez.jpg\" alt=\"Contributor photo of Edgar\" \/><\/p>\n<h3>Florian Verdonck<\/h3>\n<blockquote>\n<p>I\u2019m Florian Verdonck, an independent software consultant with a passion for open-source development. My F# open-source journey started in 2017, as part of the <a href=\"https:\/\/fsharp.org\/mentorship\/\">F#\nfoundation mentorship program<\/a>. My mentor, <a href=\"https:\/\/anthonylloyd.github.io\/\">Anthony Lloyd<\/a>, and I started\ncontributing to the <a href=\"https:\/\/fsprojects.github.io\/fantomas\/\">Fantomas<\/a> project. Maintaining led to contributing, and later, I\nwas adding to F# editor and compiler tooling. Several great mentors helped me get\nmy contributions accepted and my pull requests merged in and I\u2019m grateful to all of\nthem.<\/p>\n<p>Being inspired to contribute to the wonderful F# community is one thing. Having the\nresources to do it properly is another. Luckily, I found customers that share my\nvision of improving open source by active collaboration.<\/p>\n<p>I\u2019ve been fortunate to work with the <a href=\"https:\/\/opensource.gresearch.co.uk\/\">open-source division<\/a> of G-Research, a leading\nquantitative finance research firm. It is actively contributing to the open-source\nsoftware it uses in-house. The leaders there believe that targeted open-source\nefforts can improve the operational efficacy of their engineers and encourage me in\nmy work.<\/p>\n<\/blockquote>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2022\/11\/FlorianVerdonck.jpg\" alt=\"Contributor photo of Florian\" \/><\/p>\n<h3>Janusz Wrobel<\/h3>\n<blockquote>\n<p>I&#8217;m Janusz Wrobel, a software developer currently living in the UK.<\/p>\n<p>My programming journey, as for many, started with home projects in different technologies.\nMy first encounter with professional software projects was in .NET, which became my primary development ecosystem.<\/p>\n<p>A few years ago I encountered F# and I really liked it. Besides obvious advantages like conciseness and low overhead coding, I think that the main benefit I got from being exposed to the language was the functional programming paradigm. It allowed me to think about the same problems in a completely different way, which can be applied in OOP languages as well as functional ones. Immutability and pure code are very powerful concepts that I think we will see more of in the future with the expansion of highly-parallel and distributed computations.<\/p>\n<p>Despite its advantages, F# can be further improved, and one of the areas for improvement I think is tooling performance. That&#8217;s why I was excited to be able to contribute in this area. The prospect of seeing your changes have impact on the tooling you use everyday is an exciting one!<\/p>\n<p>When I&#8217;m not programming, you might find me trying my best at the football pitch, or watching my favourite football team play.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>F# 7 is here, see what&#8217;s new!<\/p>\n","protected":false},"author":74032,"featured_media":43323,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[685,636],"tags":[7611,7691],"class_list":["post-43191","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-fsharp","tag-dotnet-7","tag-f-7"],"acf":[],"blog_post_summary":"<p>F# 7 is here, see what&#8217;s new!<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/43191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/users\/74032"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/comments?post=43191"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/43191\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media\/43323"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media?parent=43191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/categories?post=43191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/tags?post=43191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}