1月24日,F# 4.6 预览版正式公布,与以往同样,新版本的设计与开发过程是整个 F# 开源社区共同努力的结果,此次更新的具体讨论内容能够经过下面两个连接来查看:git
此次更新的主要内容有:github
ValueOption
模块List
,Array
,Seq
新增的 tryExactlyOne
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
为了保证程序集中拥有相同结构的匿名记录类型的一致性,编译器会使用 SHA1 算法根据匿名记录的字段名列表(排序后)为匿名记录生成惟一的类型标识。函数
{| X : int |}
与 {| Y : int |}
会被生成为两个不一样的类型{| X : int; Y : int |}
与 {| Y : int; X : int |} 是同一个类型struct
关键字修饰,这样生成出来的就是结构体类型的记录了匿名记录的拷贝更新功能很是的灵活,这是由于匿名记录的拷贝更新并不要求原始类型与结果类型一致,因此下面的代码都是成立的:设计
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。code
因为匿名记录的特色,现阶段还没法对匿名记录使用模式匹配解构,这是由于当咱们把匿名记录中的某些字段在模式匹配中忽略掉的时候,可能会产生新的类型,如上面所说的,匿名记录的类型标识是由其所有的字段决定的。对象
CLIMutable
特性修饰,这也意味着匿名记录是不可变的ValueOption
模块FSharp.Core 4.6.0 中带来了 ValueOption
模块,为 FSharp.Core 4.5.0 中引入的 ValueOption
类型带来了大量的实用函数,详情请见 RFC 说明页面。blog
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 生态。ci
以上就是 F# 4.6 的更新简介,更加详细的介绍能够查看微软博客的公告以及相关的 RFC 记录。
同步发表于我的博客: F# 4.6 预览版正式公布