天天看點

F#5.0新特征總結

     目前的F#最新版本已經更新到5.0了,它随着.NET 5 SDK一起釋出,也添加了不少新的特征。這些特征有的是非常強大的。下面會根據微軟官網的F#說明文檔進行詳細的介紹。這裡需要注意一下,新版本的F# 5.0 需要首先解決SDK更新或者重新安裝的問題,并根據需要更新Visual Studio版本,否則可能會發現雖然安裝了最新的 .NET 5 SDK,但是在Visual Studio建立項目時,無法選擇到F# 5.0版本。

    1 環境準備

      首先從官網

https://dotnet.microsoft.com/download

上下載下傳 .NET 5.0 SDK,如下圖所示。這裡需要根據自身作業系統來決定下載下傳什麼版本,如果是Linux作業系統,需要下載下傳Linux頁簽下的.NET 5.0 SDK,同理,MacOS作業系統則需要下載下傳MacOS頁簽下的.NET 5.0 SDK 。

F#5.0新特征總結

     這裡的示範環境是基于Visual Stuido 社群版(免費),其版本為16.10.2 ,如果比這個低的話,建議更新到此版本或者更高。Visual Stuido 是微軟推出的一款非常強大的開發IDE,可以很好的提升我們開發代碼的效率,并進行代碼調試。

F#5.0新特征總結

      當基本的軟體環境搭建完成後,可以利用Visual Stuido 社群版建立一個F#控制台項目,并設定SDK版本為5.0。

F#5.0新特征總結

      至此,我們就可以愉快的進行F# 5新特征體驗了。

    2 F# 5 新特征示範

      首先,介紹一下字元串插值(String interpolation),它有的類似于C#或者JavaScript語言中的新特征。這個字元串插值是在字元串前利用特殊字元$來表示,且占位的字元為{變量名},這樣就可以把定義的變量進行值的替換。另外,它還是至此調用目前上下文中定義的變量值或者方法,對資料進行處理。下面給出一個示例:

[<EntryPoint>]
let main argv =
    //String interpolation
    let version = "5.0"
    let lng = "F#"
    printfn $"Language : {lng}, Version: {version}"
    printfn $"pi = {System.Math.PI}"
    printfn $" 2 * 3 - 1 = { 2 * 3 - 1 }"      

運作此示例,結果如下:

F#5.0新特征總結

另外,這個特征還允許用%Type進行類型限定,如果編譯器檢測出類型不比對,則在編碼階段即可抛出錯誤。如下圖所示:

F#5.0新特征總結

     由于變量version是一個字元串類型的值,這裡的%d代碼一個數值類型,是以不比對,在編碼階段編譯器就可以識别出錯誤,并用紅色波浪線标注。最後,這個特征最牛的地方是可以運作字元類型的代碼,這個功能太強了,雖然有一定的安全隐患。下面給出一個示例:

open System
let add x y = x + y 
let square  x  = x  * x 
[<EntryPoint>]
let main argv =
    //String interpolation
    let str_code =
        $"""run code demo:
    {
        let start = 1
        let e = add start 2
        let oddSquares xs =
            xs
            |> List.map square

        let ret = oddSquares [start..e]
        sprintf "%O" ret
    }
    """
    printfn $"{str_code}"
    0 // return an integer exit code      

     運作此程式,結果如下:

F#5.0新特征總結

      其次,介紹一下切片(Slice)一緻性,在F# 5.0之前,對于array,string , list 在特定的情況下,傳回的切片結果可能是不一緻的。而F# 5.0 後,這幾種資料結構切片的行為是一緻的。下面給出一個示例:

//切片一緻性
    let list01 = [ 2..9 ]
    let array01 = [| 2..9 |]
    let str01 = "23456789"
    let eList = list01.[1..3]
    printfn $"{eList}"
    let eArray = array01.[1..3]
    printfn $"%A{eArray}"
    let eString = str01.[1..3]
    printfn $"{eString}"      

運作此程式,結果如下:

F#5.0新特征總結

     當然,F# 5 還支援反向索引(reverse indexes),下面給出示例:

//反向索引(reverse indexes)
    let xs = [1..10]
    let lt = xs.[^1..]
    printfn $"{lt}" //[9; 10]
    let lt = xs.[..^7] 
    printfn $"{lt}" //[1; 2; 3]
    let lt = xs.[^3..^1]
    printfn $"{lt}" //[7; 8; 9]      

這個是一個preview功能,需要如下配置<LangVersion>preview</LangVersion>才能運作,如下所示:

<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <LangVersion>preview</LangVersion>
    <WarnOn>3390;$(WarnOn)</WarnOn>
  </PropertyGroup>      

最後,其他的新特征可以通路官網進行了解,網址為

https://docs.microsoft.com/en-us/dotnet/fsharp/whats-new/fsharp-50