Novedades de F# 4.7
F# 4.7 agrega varias mejoras al lenguaje F#.
Introducción
F# 4.7 está disponible en todas las distribuciones y herramientas Visual Studio .NET Core. Introducción a F# para obtener más información.
Versión de lenguaje
El compilador de F# 4.7 presenta la capacidad de establecer la versión de lenguaje efectiva a través de una propiedad en el archivo del proyecto:
<PropertyGroup>
<LangVersion>preview</LangVersion>
</PropertyGroup>
Puede establecerlo en los valores 4.6 4.7 , , y latest preview . El valor predeterminado es latest.
Si lo establece en , el compilador activará todas las características en versión preliminar de preview F# que se implementan en el compilador.
Rendimientos implícitos
Ya no es necesario aplicar la palabra clave en matrices, listas, secuencias o expresiones de cálculo donde se pueda yield inferir el tipo. En el ejemplo siguiente, ambas expresiones requerían la yield instrucción para cada entrada anterior a F# 4.7:
let s = seq { 1; 2; 3; 4; 5 }
let daysOfWeek includeWeekend =
[
"Monday"
"Tuesday"
"Wednesday"
"Thursday"
"Friday"
if includeWeekend then
"Saturday"
"Sunday"
]
Si introduce una sola yield palabra clave, todos los demás elementos también se deben yield haber aplicado a ella.
Los rendimientos implícitos no se activan cuando se usan en una expresión que también usa yield! para hacer algo como aplanar una secuencia. Debe seguir usando hoy yield en estos casos.
Identificadores de caracteres comodín
En el código de F# que implica clases, el identificador propio debe ser siempre explícito en las declaraciones de miembro. Pero en los casos en los que nunca se usa el identificador propio, tradicionalmente ha sido una convención usar un carácter de doble subrayado para indicar los identificadores propios sin nombre. Ahora puede usar un único carácter de subrayado:
type C() =
member _.M() = ()
Esto también se aplica a for los bucles:
for _ in 1..10 do printfn "Hello!"
Relajaciones de sangría
Antes de F# 4.7, los requisitos de sangría para el constructor principal y los argumentos de miembro estático requerían una sangría excesiva. Ahora solo requieren un ámbito de sangría único:
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