Partilhar via


O que há de novo no F# 4.7

O F# 4.7 adiciona várias melhorias à linguagem F#.

Começar agora

O F# 4.7 está disponível em todas as distribuições .NET Core e ferramentas do Visual Studio. Comece a usar o F# para saber mais.

Versão linguística

O compilador F# 4.7 introduz a capacidade de definir sua versão de idioma efetiva por meio de uma propriedade em seu arquivo de projeto:

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

Você pode defini-lo com os valores 4.6, 4.7, latest, e preview. A predefinição é latest.

Se você defini-lo como preview, seu compilador ativará todos os recursos de visualização do F# que são implementados no compilador.

Rendimentos implícitos

Você não precisa mais aplicar a yield palavra-chave em matrizes, listas, sequências ou expressões de computação onde o tipo pode ser inferido. No exemplo a seguir, ambas as expressões exigiam a yield instrução para cada entrada anterior ao 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 você introduzir uma única yield palavra-chave, todos os outros itens também devem ter yield se aplicado a ela.

Os rendimentos implícitos não são ativados quando usados em uma expressão que também usa yield! para fazer algo como achatar uma sequência. Nestes casos, deve continuar a utilizar yield hoje.

Identificadores curinga

No código F# envolvendo classes, o autoidentificador precisa estar sempre explícito nas declarações de membro. Mas nos casos em que o autoidentificador nunca é usado, tem sido tradicionalmente convencional usar um sublinhado duplo para indicar um autoidentificador sem nome. Agora você pode usar um único sublinhado:

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

Isso também se aplica aos for loops:

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

Relaxamentos de recuo

Antes do F# 4.7, os requisitos de recuo para argumentos de construtor primário e membro estático exigiam recuo excessivo. Eles agora exigem apenas um único escopo de recuo:

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