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