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
, latest
e 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