Novità di F# 4.7

F# 4.7 aggiunge più miglioramenti al linguaggio F#.

Operazioni preliminari

F# 4.7 è disponibile in tutte le distribuzioni di .NET Core e gli strumenti di Visual Studio. Introduzione a F# per altre informazioni.

Versione del linguaggio

Il compilatore F# 4.7 introduce la possibilità di impostare la versione effettiva del linguaggio tramite una proprietà nel file di progetto:

<PropertyGroup>
    <LangVersion>preview</LangVersion>
</PropertyGroup>

È possibile impostarlo sui valori 4.6, 4.7, lateste preview. Il valore predefinito è latest.

Se si imposta su preview, il compilatore attiverà tutte le funzionalità di anteprima F# implementate nel compilatore.

Rendimenti impliciti

Non è più necessario applicare la yield parola chiave in matrici, elenchi, sequenze o espressioni di calcolo in cui è possibile dedurre il tipo. Nell'esempio seguente entrambe le espressioni richiedono l'istruzione yield per ogni voce prima di F# 4.7:

let s = seq { 1; 2; 3; 4; 5 }

let daysOfWeek includeWeekend =
    [
        "Monday"
        "Tuesday"
        "Wednesday"
        "Thursday"
        "Friday"
        if includeWeekend then
            "Saturday"
            "Sunday"
    ]

Se si introduce una singola yield parola chiave, a ogni altro elemento deve essere applicato anche yield un elemento.

I rendimenti impliciti non vengono attivati quando vengono usati in un'espressione che usa yield! anche per eseguire operazioni come appiattire una sequenza. È necessario continuare a usare yield oggi in questi casi.

Identificatori con caratteri jolly

Nel codice F# che coinvolge le classi, l'identificatore automatico deve essere sempre esplicito nelle dichiarazioni dei membri. Tuttavia, nei casi in cui l'identificatore automatico non viene mai usato, è stato tradizionalmente convenzione usare un doppio carattere di sottolineatura per indicare un self-identifier senza nome. È ora possibile usare un singolo carattere di sottolineatura:

type C() =
    member _.M() = ()

Questo vale anche per for i cicli:

for _ in 1..10 do printfn "Hello!"

Riposi di rientro

Prima di F# 4.7, i requisiti di rientro per gli argomenti del costruttore primario e dei membri statici richiedevano un rientro eccessivo. Ora richiedono solo un singolo ambito di rientro:

type OffsideCheck(a:int,
    b:int, c:int,
    d:int) = class end

type C() =
    static member M(a:int,
        b:int, c:int,
        d:int) = 1