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 de .NET Core y las herramientas de Visual Studio. 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 vigente mediante una propiedad en el archivo del proyecto:

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

Puede establecerla en los valores 4.6, 4.7, latest y preview. El valor predeterminado es latest.

Si la establece en preview, el compilador activará todas las características en versión preliminar de F# que se implementan en el compilador.

Elementos yield implícitos

Ya no es necesario aplicar la palabra clave yield en matrices, listas, secuencias o expresiones de cálculo en las que se puede deducir el tipo. En el ejemplo siguiente, ambas expresiones requerían la instrucción yield 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 se introduce una sola palabra clave yield, todos los demás elementos también deben tener yield aplicado.

Los elementos yield implícitos no se activan cuando se usan en una expresión que también usa yield! para hacer algo como aplanar una secuencia. Actualmente, debe seguir usando yield en estos casos.

Identificadores de caracteres comodín

En el código de F# que implica clases, el identificador propio siempre debe ser explícito en las declaraciones de miembro. Aun así, en los casos en los que nunca se usa el identificador propio, tradicionalmente se sigue la convención de usar un carácter de subrayado doble para indicar un identificador propio sin nombre. Ahora puede usar un solo carácter de subrayado:

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

Esto también se aplica a los bucles for:

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

Flexibilidad de la sangría

Antes de F# 4.7, los requisitos de sangría para los argumentos de constructor principal y de miembro estático requerían una sangría excesiva. Ahora solo requieren un único ámbito de sangría:

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