当前的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 。
这里的演示环境是基于Visual Stuido 社区版(免费),其版本为16.10.2 ,如果比这个低的话,建议升级到此版本或者更高。Visual Stuido 是微软推出的一款非常强大的开发IDE,可以很好的提升我们开发代码的效率,并进行代码调试。
当基本的软件环境搭建完成后,可以利用Visual Stuido 社区版新建一个F#控制台项目,并设置SDK版本为5.0。
至此,我们就可以愉快的进行F# 5新特征体验了。
2 F# 5 新特征演示
首先,介绍一下字符串插值(String interpolation),它有的类似于C#或者JavaScript语言中的新特征。这个字符串插值是在字符串前利用特殊字符$来表示,且占位的字符为{变量名},这样就可以把定义的变量进行值的替换。另外,它还是至此调用当前上下文中定义的变量值或者方法,对数据进行处理。下面给出一个示例:
[<EntryPoint>] letmainargv=//String interpolationletversion="5.0"letlng="F#"printfn$"Language : {lng}, Version: {version}"printfn$"pi = {System.Math.PI}"printfn$" 2 * 3 - 1 = { 2 * 3 - 1 }"
运行此示例,结果如下:
另外,这个特征还允许用%Type进行类型限定,如果编译器检测出类型不匹配,则在编码阶段即可抛出错误。如下图所示:
由于变量version是一个字符串类型的值,这里的%d代码一个数值类型,因此不匹配,在编码阶段编译器就可以识别出错误,并用红色波浪线标注。最后,这个特征最牛的地方是可以运行字符类型的代码,这个功能太强了,虽然有一定的安全隐患。下面给出一个示例:
openSystemletaddxy=x+yletsquarex=x*x[<EntryPoint>] letmainargv=//String interpolationletstr_code=$"""run code demo: { letstart=1lete=addstart2letoddSquaresxs=xs|>List.mapsquareletret=oddSquares [start..e] sprintf"%O"ret } """printfn$"{str_code}"0// return an integer exit code
运行此程序,结果如下:
其次,介绍一下切片(Slice)一致性,在F# 5.0之前,对于array,string , list 在特定的情况下,返回的切片结果可能是不一致的。而F# 5.0 后,这几种数据结构切片的行为是一致的。下面给出一个示例:
//切片一致性letlist01= [ 2..9 ] letarray01= [|2..9|] letstr01="23456789"leteList=list01.[1..3] printfn$"{eList}"leteArray=array01.[1..3] printfn$"%A{eArray}"leteString=str01.[1..3] printfn$"{eString}"
运行此程序,结果如下:
当然,F# 5 还支持反向索引(reverse indexes),下面给出示例:
//反向索引(reverse indexes)letxs= [1..10] letlt=xs.[^1..] printfn$"{lt}"//[9; 10]letlt=xs.[..^7] printfn$"{lt}"//[1; 2; 3]letlt=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