Novinky v F# 4.7

F# 4.7 přidává několik vylepšení jazyka F#.

Začínáme

F# 4.7 je k dispozici ve všech distribucích .NET Core a nástrojích sady Visual Studio. Začněte s jazykem F# a získejte další informace.

Jazyková verze

Kompilátor F# 4.7 zavádí možnost nastavit efektivní jazykovou verzi prostřednictvím vlastnosti v souboru projektu:

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

Můžete ho nastavit na hodnoty 4.6, 4.7, latesta preview. Výchozí hodnota je latest.

Pokud ho nastavíte na preview, kompilátor aktivuje všechny funkce F# preview implementované v kompilátoru.

Implicitní výnosy

Už není nutné použít yield klíčové slovo v polích, seznamech, sekvencích nebo výpočetních výrazech, kde lze typ odvodit. V následujícím příkladu oba výrazy vyžadovaly yield příkaz pro každou položku před F# 4.7:

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

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

Pokud zavádíte jedno yield klíčové slovo, musí se na něj použít také yield každá další položka.

Implicitní výnosy se neaktivují při použití ve výrazu, který používá yield! také k vytvoření něčeho podobného jako zploštění sekvence. V těchto případech je nutné pokračovat v používání yield .

Identifikátory zástupných znaků

V kódu jazyka F# zahrnujícím třídy musí být identifikátor self-identifier vždy explicitní v deklaracích členů. Ale v případech, kdy se vlastní identifikátor nikdy nepoužívá, byla tradičně konvence použít dvojité podtržítko k označení beznázvových identifikátorů sebe sama. Teď můžete použít jedno podtržítko:

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

Platí to také pro for smyčky:

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

Odpočinek odsazení

Před jazykem F# 4.7 vyžadovaly odsazení požadavky na odsazení primárních konstruktorů a argumentů statického člena nadměrné odsazení. Teď vyžadují pouze jeden obor odsazení:

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