Yang baru di F# 4.7

F# 4.7 menambahkan beberapa peningkatan ke bahasa pemrogram F#.

Memulai

F# 4.7 tersedia di semua distribusi .NET Core dan peralatan Visual Studio. Mulai menggunakan F# untuk mempelajari selengkapnya.

Versi bahasa

Kompilator F# 4.7 memperkenalkan kemampuan untuk mengatur versi bahasa pemrogram yang efektif melalui properti di dalam file proyek Anda:

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

Anda dapat mengaturnya ke nilai 4.6, 4.7, latest, dan preview. Default adalah latest.

Jika Anda mengaturnya ke preview, kompilator Anda akan mengaktifkan semua fitur pratinjau F# yang diterapkan di kompilator Anda.

Hasil implisit

Anda tidak perlu lagi menerapkan kata kunci yield dalam array, daftar, urutan, atau ekspresi komputasi tempat jenis dapat disimpulkan. Dalam contoh berikut, kedua ekspresi memerlukan pernyataan yield untuk setiap entri sebelum F# 4.7:

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

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

Jika Anda memperkenalkan satu kata kunci yield, setiap item lain juga harus memiliki yield yang diterapkan padanya.

Hasil implisit tidak diaktifkan ketika digunakan dalam ekspresi yang juga menggunakan yield! untuk melakukan sesuatu seperti perataan urutan. Anda harus terus menggunakan yield hari ini dalam berbagai kasus seperti ini.

Pengidentifikasi wildcard

Dalam kode F# yang melibatkan kelas, pengidentifikasi mandiri harus selalu eksplisit dalam deklarasi anggota. Tetapi dalam kasus di mana pengidentifikasi mandiri tidak pernah digunakan, biasanya konvensi untuk menggunakan garis bawah ganda untuk menunjukkan pengidentifikasi mandiri tanpa nama. Sekarang Anda dapat menggunakan satu garis bawah:

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

Ini juga berlaku untuk perulangan for:

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

Relaksasi indentasi

Sebelum F# 4.7, persyaratan indentasi untuk konstruktor utama dan argumen anggota statis memerlukan indentasi berlebihan. Sekarang hanya memerlukan satu cakupan indentasi:

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