Logo F# Compiler Guide

FSharp.Compiler.Service

43.12.201 - 2026-03-12

Nuget Nuget Nuget Nuget

Fixed

Added

Changed

Breaking Changes

43.12.100 - 2026-03-10

Nuget

Fixed

Added

Improved

Changed

Breaking Changes

43.11.300 - 2026-05-12

Nuget Nuget Nuget Nuget

Fixed

Added

Changed

Breaking Changes

43.10.100 - 2025-11-11

Nuget Nuget Nuget Nuget Nuget Nuget Nuget Nuget Nuget Nuget Nuget Nuget Nuget

Added

Fixed

Changed

Breaking Changes

Migration Guidance for AST Users

Note: The unified AST introduces two new boolean fields:

1. Pattern Matching Updates

Before:

match expr with
| SynExpr.LetOrUse(isRec, isUse, bindings, body, range, trivia) ->
    // Handle regular let/use
| SynExpr.LetOrUseBang(spBind, isUse, isFromSource, pat, rhs, andBangs, body, range, trivia) ->
    // Handle let!/use!

After:

match expr with
| SynExpr.LetOrUse(isRec, isUse, isFromSource, isBang, bindings, body, range, trivia) ->
    if isBang then
        // This is a let!/use! expression
        match bindings with
        | firstBinding :: andBangs ->
            match firstBinding with
            | SynBinding(headPat = pat; expr = rhs) ->
                // pat and rhs extracted from first binding
                // andBangs contains the and! bindings
        | [] -> // error case
    else
        // This is a regular let/use expression

2. Construction Updates

Before:

// Creating a let! expression
SynExpr.LetOrUseBang(
    bindDebugPoint,
    false,  // isUse
    true,   // isFromSource
    pat,
    rhsExpr,
    andBangs,
    bodyExpr,
    range,
    trivia
)

After:

// Creating a let! expression
let firstBinding = SynBinding(
    accessibility = None,
    kind = SynBindingKind.Normal,
    isInline = false,
    isMutable = false,
    attributes = [],
    xmlDoc = PreXmlDoc.Empty,
    valData = SynInfo.emptySynValData,
    headPat = pat,           // Pattern moved here
    returnInfo = None,
    expr = rhsExpr,          // RHS moved here
    range = range,
    debugPoint = bindDebugPoint,  // Debug point moved here
    trivia = bindingTrivia
)
SynExpr.LetOrUse(
    false,  // isRecursive
    false,  // isUse
    true,   // isFromSource
    true,   // isBang (indicates let!)
    firstBinding :: andBangs,  // All bindings in single list
    bodyExpr,
    range,
    trivia
)

3. Common Migration Patterns

Checking for computation expressions:

// Before
match expr with
| SynExpr.LetOrUseBang _ -> true
| _ -> false

// After
match expr with
| SynExpr.LetOrUse(isBang = true) -> true
| _ -> false

Extracting pattern and expression from let!:

// Before
| SynExpr.LetOrUseBang(_, _, _, pat, rhs, _, _, _, _) ->
    processBinding pat rhs

// After
| SynExpr.LetOrUse(isBang = true; bindings = binding :: _) ->
    match binding with
    | SynBinding(headPat = pat; expr = rhs) ->
        processBinding pat rhs
    | _ -> // error

Processing and! bindings:

// Before
| SynExpr.LetOrUseBang(_, _, _, firstPat, firstRhs, andBangs, _, _, _) ->
    processFirst firstPat firstRhs
    for andBang in andBangs do
        processAndBang andBang

// After
| SynExpr.LetOrUse(isBang = true; bindings = bindings) ->
    match bindings with
    | first :: rest ->
        processBinding first
        for andBang in rest do
            processAndBang andBang
    | [] -> // error

[^1]: See Migration Guidance for AST Users section for detailed information on how to update your code to work with the unified AST representation.

43.9.300 - 2025-05-13

Nuget Nuget

Fixed

Added

Changed

Breaking Changes

43.9.202 - 2025-04-08

Nuget

Fixed

Added

Changed

Breaking Changes

43.9.201 - 2025-02-11

Nuget

Fixed

Added

Changed

Breaking Changes

43.9.100 - 2024-11-12

Nuget Nuget

Fixed

Added

Changed

Breaking Changes

43.8.400 - 2024-08-13

Nuget Nuget Nuget

Fixed

Added

Changed

43.8.300 - 2024-05-14

Nuget Nuget

Fixed

Added

Changed

F# 8.0.202 - Not on NuGet

Fixed

nameof Module expressions and patterns are processed to link files in --test:GraphBasedChecking. (PR #16570, PR #16747)

43.8.200 - 2024-02-13

Nuget

Fixed

Added

Changed

43.8.100 - 2023-11-14

Nuget Nuget Nuget

Fixed

namespace System
namespace System.IO
namespace System.Xml
namespace System.Xml.Linq
namespace Markdig
module Common
val path: string
type Path = static member ChangeExtension: path: string * extension: string -> string static member Combine: path1: string * path2: string -> string + 4 overloads static member EndsInDirectorySeparator: path: ReadOnlySpan<char> -> bool + 1 overload static member Exists: path: string -> bool static member GetDirectoryName: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetExtension: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFileName: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFileNameWithoutExtension: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFullPath: path: string -> string + 1 overload static member GetInvalidFileNameChars: unit -> char array ...
<summary>Performs operations on <see cref="T:System.String" /> instances that contain file or directory path information. These operations are performed in a cross-platform manner.</summary>
Path.Combine(paths: System.ReadOnlySpan<string>) : string
Path.Combine( paths: string array) : string
Path.Combine(path1: string, path2: string) : string
Path.Combine(path1: string, path2: string, path3: string) : string
Path.Combine(path1: string, path2: string, path3: string, path4: string) : string
val renderPackageReleaseNotes: packageName: string -> path: string -> minPackageVersion: System.Version -> packageVersionOfNotes: (System.Version -> System.Version) -> upcomingVersion: System.Version -> string
 Renders the release notes of a package: one section per notes file in `path`, ordered by
 package version, newest first. Which package versions belong to a notes file is looked up
 from the source commit of each package on NuGet, from `minPackageVersion` on.

 Notes without a package are either the upcoming release, placed at the top as `upcomingVersion`,
 or an old servicing version that never shipped, placed where `packageVersionOfNotes` puts it.
Multiple items
type Version = interface ICloneable interface IComparable interface IComparable<Version> interface IEquatable<Version> interface IFormattable interface ISpanFormattable interface IUtf8SpanFormattable interface IUtf8SpanParsable<Version> new: unit -> unit + 4 overloads member Clone: unit -> obj ...
<summary>Represents the version number of an assembly, operating system, or the common language runtime. This class cannot be inherited.</summary>

--------------------
System.Version() : System.Version
System.Version(version: string) : System.Version
System.Version(major: int, minor: int) : System.Version
System.Version(major: int, minor: int, build: int) : System.Version
System.Version(major: int, minor: int, build: int, revision: int) : System.Version
val notes: System.Version
property System.Version.Major: int with get
<summary>Gets the value of the major component of the version number for the current <see cref="T:System.Version" /> object.</summary>
<returns>The major version number.</returns>
property System.Version.Build: int with get
<summary>Gets the value of the build component of the version number for the current <see cref="T:System.Version" /> object.</summary>
<returns>The build number, or -1 if the build number is undefined.</returns>
val upcomingFcsVersion: System.Version
 The F# version main is at, and the FCS version that goes with it

Type something to start searching.