Co nowego w języku F# 4.7
Język F# 4.7 dodaje wiele ulepszeń języka F#.
Rozpocznij
Język F# 4.7 jest dostępny we wszystkich dystrybucjach platformy .NET Core i narzędziach programu Visual Studio. Rozpocznij pracę z językiem F# , aby dowiedzieć się więcej.
Wersja języka
Kompilator języka F# 4.7 wprowadza możliwość ustawiania obowiązującej wersji językowej za pomocą właściwości w pliku projektu:
<PropertyGroup>
<LangVersion>preview</LangVersion>
</PropertyGroup>
Można ustawić je na wartości 4.6
, , 4.7
latest
i preview
. Wartość domyślna to latest
.
Jeśli ustawisz go na preview
wartość , kompilator aktywuje wszystkie funkcje w wersji zapoznawczej języka F#, które są implementowane w kompilatorze.
Niejawne plony
Nie trzeba już stosować słowa kluczowego yield
w tablicach, listach, sekwencjach lub wyrażeniach obliczeniowych, w których można wywnioskować typ. W poniższym przykładzie oba wyrażenia wymagały instrukcji yield
dla każdego wpisu przed F# 4.7:
let s = seq { 1; 2; 3; 4; 5 }
let daysOfWeek includeWeekend =
[
"Monday"
"Tuesday"
"Wednesday"
"Thursday"
"Friday"
if includeWeekend then
"Saturday"
"Sunday"
]
W przypadku wprowadzenia pojedynczego yield
słowa kluczowego każdy inny element musi również zostać yield
do niego zastosowany.
Niejawne plony nie są aktywowane w przypadku użycia w wyrażeniu, które również używa yield!
do wykonywania czegoś takiego jak spłaszczanie sekwencji. W tych przypadkach należy nadal używać yield
.
Identyfikatory symboli wieloznacznych
W kodzie języka F# obejmującym klasy identyfikator własny musi zawsze być jawny w deklaracjach składowych. Jednak w przypadkach, gdy identyfikator własny nigdy nie jest używany, tradycyjnie była konwencja użycia podwójnego podkreślenia, aby wskazać beznazwalne identyfikatory. Teraz możesz użyć pojedynczego podkreślenia:
type C() =
member _.M() = ()
Dotyczy to również for
pętli:
for _ in 1..10 do printfn "Hello!"
Złagodzenie wcięcia
Przed wersją F# 4.7 wymagania dotyczące wcięcia dla konstruktora podstawowego i argumentów statycznych składowych wymagały nadmiernego wcięcia. Teraz wymagają tylko jednego zakresu wcięcia:
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