Новые возможности F# 4.7

F# 4.7 добавляет несколько улучшений в язык F#.

Начать

F# 4.7 доступен во всех дистрибутивах .NET Core и инструментах Visual Studio. Приступая к работе с F# , чтобы узнать больше.

Версия языка

Компилятор F# 4.7 представляет возможность задать эффективную языковую версию с помощью свойства в файле проекта:

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

Его можно задать для значений 4.6, 4.7и latestpreview. Значение по умолчанию — latest.

Если этот параметр задан preview, компилятор активирует все функции предварительной версии F#, реализованные в компиляторе.

Неявные доходы

Больше не нужно применять yield ключевое слово в массивах, списках, последовательностях или выражениях вычислений, где можно вывести тип. В следующем примере оба выражения требуют инструкции yield для каждой записи до F# 4.7:

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

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

Если вы вводите один yield ключевое слово, к нему также yield должны применяться все остальные элементы.

Неявные выходы не активируются при использовании в выражении, которое также используется yield! для выполнения таких действий, как плоская последовательность. В этих случаях необходимо продолжать использовать yield .

Идентификаторы wild карта

В коде F# с участием классов идентификатор самостоятельно должен всегда быть явным в объявлениях членов. Но в случаях, когда идентификатор самозаписи никогда не используется, оно традиционно было соглашение об использовании двойного подчеркивания для указания безымяных самоидификционных идентификаторов. Теперь можно использовать один символ подчеркивания:

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

Это также относится к for циклам:

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

Отступы расслабления

До F# 4.7 требования к отступам для основного конструктора и статических аргументов-членов требуют чрезмерной отступы. Теперь для них требуется только одна отступная область:

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