F# 4.6 预览版正式公布
1月24日,F# 4.6 预览版正式公布,与以往一样,新版本的设计与开发过程是整个 F# 开源社区共同努力的结果,这次更新的具体讨论内容可以通过下面两个链接来查看:
这次更新的主要内容有:
- 匿名记录类型(Anonymous Records)
ValueOption模块- 为
List,Array,Seq新增的tryExactlyOne
匿名记录类型(Anonymous Records)
快速上手
F# 新增了匿名记录类型,举个例子:
// {| ... |} 用来声明一个匿名的记录
let data = {| X = 1; Y = "abc" |}
// val data : {| X : int; Y : string |}
let result = data.X + data.Y.Length
// 匿名记录同样可以使用 with 关键字复制并更新
let newData = {| data with Z = data.X + 5 |}
// 匿名记录还可以作为函数的参数使用
let someFunc (d: {| X : int; Y: string |}) =
printfn "X: %d; Y: %s" d.X d.Y
为什么我们需要这个新特性
- F# 中声明一个记录类型真的很繁琐,尤其是我们只需要一次性的引用一个记录类型的时候
- C# 3.0 引入的匿名对象在 F# 中找不到对应的概念,这在把 C# 代码转换为 F# 代码的时候带来很大的痛苦
- C# 7.0 为元组类型添加了命名字段,而当前的 F# 会忽略掉这部分的信息
匿名记录的类型
为了保证程序集中拥有相同结构的匿名记录类型的一致性,编译器会使用 SHA1 算法根据匿名记录的字段名列表(排序后)为匿名记录生成唯一的类型标识。
{| X : int |}与{| Y : int |}会被生成为两个不同的类型{| X : int; Y : int |}与 {| Y : int; X : int |} 是同一个类型- 匿名记录可以使用
struct关键字修饰,这样生成出来的就是结构体类型的记录了
与 Record 的不同
拷贝更新
匿名记录的拷贝更新功能非常的灵活,这是因为匿名记录的拷贝更新并不要求原始类型与结果类型一致,所以下面的代码都是成立的:
type RefRecord = { X : int; }
let refRecord = { X = 1 }
// 结果类型不必与原始类型相同
let dataA = {| refRecord with Y = "string" |} // 结果为 {| X = 1; Y = "string" |}
let dataB = {| dataA with Y = 23333 |} // 结果为 {| X = 1; Y = 23333 |}
// 甚至还可以从引用类型中拷贝数据到结构体中,反过来也是可以的
let dataC = struct {| dataB with Z = true |} // 结果为 {| X = 1; Y = 23333; Z = true |}
不过在现阶段,我们还是无法通过拷贝更新的方法用匿名记录来创建 Record。
模式匹配
由于匿名记录的特点,现阶段还无法对匿名记录使用模式匹配解构,这是因为当我们把匿名记录中的某些字段在模式匹配中忽略掉的时候,可能会产生新的类型,如上面所说的,匿名记录的类型标识是由其全部的字段决定的。
其他的一些限制
- 无法使用
CLIMutable特性修饰,这也意味着匿名记录是不可变的 - 匿名记录无法定义类成员(包括成员字段、属性、方法等),这是因为记录仅仅只是用来保存数据的,
ValueOption 模块
FSharp.Core 4.6.0 中带来了 ValueOption 模块,为 FSharp.Core 4.5.0 中引入的 ValueOption 类型带来了大量的实用函数,详情请见 RFC 说明页面。
为 List,Array,Seq 新增的 tryExactlyOne
这个函数类似于 LINQ 中的 SingleOrDefault(),不过它并不会抛出异常,而是以一个温和的 Option 类型作为返回值:
List.tryExactlyOne []
// None
List.tryExactlyOne [1]
// Some 1
List.tryExactlyOne [1; 2]
// None
Array.tryExactlyOne null
// ArgumentNullException
Array.tryExactlyOne [||]
// None
Array.tryExactlyOne [|1|]
// Some 1
Array.tryExactlyOne [|1; 2|]
// None
Seq.tryExactlyOne null
// ArgumentNullException
Seq.tryExactlyOne (Seq.ofList [])
// None
Seq.tryExactlyOne (Seq.ofList [1])
// Some 1
Seq.tryExactlyOne (Seq.ofList [1; 2])
// None
最后
尽管 F# 4.6 只是一个小小的功能特性更新,但是匿名记录出现给 F# 开发带来了新的活力,除了能够减少代码量之外,匿名记录也让 F# 开发者能够更加轻松的使用以 C# 为主导的 .NET 生态。
以上就是 F# 4.6 的更新简介,更加详细的介绍可以查看微软博客的公告以及相关的 RFC 记录。
同步发表于个人博客: F# 4.6 预览版正式公布
F# 4.6 预览版正式公布的更多相关文章
- .NET 7 预览版2 的亮点之 NativeAOT 正式合并入 .NET 主线
.NET 中备受追捧和期待已久的功能NativeAOT终于出现在本周的.NET 7 预览版2中,该项目的工作仍在继续,该版本将 NativeAOT 从实验性的 dotnet/runtimelab re ...
- 终于等到你!微软正式上线 Windows Terminal 预览版
前一段时间,一直在知乎.技术社区收到技术小伙伴们的终极拷问:微软Build 大会上提到的**6月中旬**要上Windows store 的 Windows Terminal 到底啥时候可以用到呀? 有 ...
- 微软发布了ASP.NET WebHooks预览版
微软 近期发布了ASP.NET WebHooks的预览版 ,这是一个可用于创建及使用Webhook功能的库.WebHooks支持MVC 5及WebApi 2. Webhook是一种通过HTTP实现用户 ...
- win10最新预览版9926使用评估
1月21日微软发布会,终于在周一发布了新的预览版本Build 9926,这个并不是客户预览版,仍然是开发者预览版,如图: 如果要查看自己的windows 10是那个版本,打开运行窗口,输入如下命令: ...
- Swift 3.0首个开发者预览版将在5月12日释出
Swift团队在博客中宣布Swift 3.0语言首个开发者预览版将于5月12日释出,正式版将在4-6周之后推出.开发者预览阶段并无确定的更新周期和计划,不过Swift团队称努力将其控 制在4-6周内. ...
- Windows 10简体中文最新预览版Build 9926
Windows 10 消费者预览版全新特性: • 全新的开始菜单Win 10的开始菜单产生了较大改变,磁贴界面在原有磁贴概念的基础上进行了大幅度的调整,新的磁贴界面开始支持纵向滚动,并可以利用开始按钮 ...
- 传Windows 9预览版今秋发布
据ZDNet长期关注微软动态的资深人士玛丽•乔•弗利(Mary Jo Foley)称,Windows 9预览版将会在9月或者10月推出.按照这一进度,代号为“Threshold’”的Windows 9 ...
- Azure SQL 数据库最新版本现已提供预览版
Tiffany Wissner 数据平台营销高级总监 我们之前在11月宣布将提供新的预览版,在该预览版中我们引入了接近完整的 SQL Server 引擎兼容性和更为高级的性能,这些都代表了下一代的 ...
- VS2015预览版中的C#6.0 新功能(三)
VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(二) Using static 使用using StaticClass,你可以访问StaticClass类里的 ...
随机推荐
- 1.使用FluentNHibemate 操作数据库,添加映射到数据库
1.创建个控制台工程MySQLDateBase 2.工程中添加Fluent NHibernate映射工具 点击管理NuGet程序包,点击浏览,搜索Fluent NHibernate 点击安装..安装完 ...
- 查看服务器被访问最大的ip
网站有时会很卡,可以先看看哪些ip访问最多,一行命令就可以列出来,如下所示 netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c ...
- React于React native的渲染机制
面向virtual DOM编程 vs 面向native componet编程: 状态编程引起的UI变化会全部提交到native compnent然后走平台原来的渲染流程. The DOM is jus ...
- (0)开始 Raspberry Pi 项目前需要知道的 10 件事
https://www.digikey.cn/zh/articles/techzone/2017/feb/10-things-to-know-before-starting-a-raspberry-p ...
- (10)树莓派 vim编辑器使用
进去后 1点击 insert 插入数据 2 ctrl+alt+c 粘贴内容 或者 手动敲入代码 3 ctrl+v 保存 4 :wq 保存退出 5 回车
- 使用jenkins exporter 监控jenkins 构建任务
jenkins 提供了rest api,我们可以基于rest api 暴露prometheus metrics,社区已经有了好多 开源的实现了,使用起来也比较方便,以下集成几个进行简单的测试 环境准备 ...
- 洛谷 P2872 【[USACO07DEC]道路建设Building Roads】
P2872 传送门 首先 题目概括:题目让着求使所有牧场都联通.需要修建多长的路. 显然这是一道最小生成树板子题(推荐初学者做). 那我就说一下kruskal吧. Kruskal算法是一种用来查找最小 ...
- xss、SQL测试用例小结
xss测试用例小结: <script>alert("跨站")</script> (最常用)<img scr=javascript:alert(&quo ...
- linux高性能服务器编程 (二) --IP协议详解
第二章 IP协议详解 什么是IP协议:IP 协议是TCP/IP协议族的动力,它为上层提供了无状态.无连接.不可靠的服务. IP 头部信息:头部信息会出现在每一个IP数据报上,便于记录IP通信的源端IP ...
- Golang 接口
1 接口是什么 Golang中没有像Python.Java拥有类和对象的概念,其封装对象或说明对象是通过接口来实现的.比如谁能够实现什么样的功能,便能够将其抽象化封装. 接口定义了一组方法(抽象方法集 ...