【F#从入门到实战】04. F#5.0新特征总结

举报
jackwangcumt 发表于 2021/06/29 07:16:21 2021/06/29
【摘要】 F# 5.0随着.NET 5.0一起发布,.NET 5.0是为了让更多的开发人员能够将他们的.NET Framework代码和应用程序迁移到.NET5.0。它是.NET Framework和.NET Core核心的结合,旨在统一.NET平台。F# 5.0 引入了几个新特征,其中的字符串插值和统一切片行为是个人感觉非常实用的功能,这里重点介绍。

       欢迎大家来到【F#从入门到实战】,在这里我将分享关于F#编程语言的系列文章,带大家一起去学习和成长,并探索函数编程语言F#这个有趣的世界。所有文章都会结合示例代码和笔者的经验进行讲解,真心想把十余年的IT经验分享给大家,希望对您有所帮助,文章中也定有不足之处,请海涵!本系统文章将从F#基本语法入手,逐步通过自定义类型来实现数学表达式的各种常见解析操作,如对表达式进行求值、化简、展开、求导和求积分等。此系统博文也是了解和实现一个简易的计算机代数系统的基础。

      下面给出【F#从入门到实战】系统专题文章的目录:

【F#从入门到实战】01. F#语言快速入门 
【F#从入门到实战】02. F#数组常见用法   
【F#从入门到实战】03. F#自定义操作符 
【F#从入门到实战】04. F#5.0新特征总结 
【F#从入门到实战】05. F#表达式求值     
【F#从入门到实战】06. F#表达式化简    
【F#从入门到实战】07. F#表达式展开    
【F#从入门到实战】08. F#大整数阶乘    
【F#从入门到实战】09. F#表达式求导   
【F#从入门到实战】10. F#表达式积分   
【F#从入门到实战】11. F#库FParsec入门  
【F#从入门到实战】12. F#库FParsec解析表达式   
【F#从入门到实战】13. F#库FParsec实现求导符号计算   
【F#从入门到实战】14. F#实现分部积分法   

     下面将正式开始本文的介绍: 

     当前的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 。

0.jpg

     这里的演示环境是基于Visual Stuido 社区版(免费),其版本为16.10.2 ,如果比这个低的话,建议升级到此版本或者更高。Visual Stuido 是微软推出的一款非常强大的开发IDE,可以很好的提升我们开发代码的效率,并进行代码调试。

1.jpg

      当基本的软件环境搭建完成后,可以利用Visual Stuido 社区版新建一个F#控制台项目,并设置SDK版本为5.0。

2.jpg

      至此,我们就可以愉快的进行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 }"

     运行此示例,结果如下:

3.jpg

     另外,这个特征还运行用%Type进行类型限定,如果编译器检测出类型不匹配,则在编码阶段即可抛出错误。如下图所示:

4.jpg

     由于变量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

     运行此程序,结果如下:

5.jpg

      其次,介绍一下切片(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}"

     运行此程序,结果如下:

6.jpg

     当然,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





【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。