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.7latesti preview. Wartość domyślna to latest.

Jeśli ustawisz go na previewwartość , 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