F# 4.7 中的新增功能

F# 4.7 对 F# 语言进行了多项改进。

入门

F# 4.7 在所有 .NET Core 分发版和 Visual Studio 工具中提供。 开始使用 F# 以了解详细信息。

语言版本

F# 4.7 编译器引入了通过项目文件中的属性设置有效语言版本的功能:

<PropertyGroup>
    <LangVersion>preview</LangVersion>
</PropertyGroup>

可以将它设置为值 4.64.7latestpreview。 默认为 latest

如果将其设置为 preview,则编译器将激活在编译器中实现的所有 F# 预览功能。

隐式生成

不再需要在可以推断类型的数组、列表、序列或计算表达式中应用 yield 关键字。 在下面的示例中,对于 F# 4.7 之前的每个条目,两个表达式都需要 yield 语句:

let s = seq { 1; 2; 3; 4; 5 }

let daysOfWeek includeWeekend =
    [
        "Monday"
        "Tuesday"
        "Wednesday"
        "Thursday"
        "Friday"
        if includeWeekend then
            "Saturday"
            "Sunday"
    ]

如果引入单个 yield 关键字,则其他每个项目也必须应用 yield

当在还使用 yield! 执行诸如平展序列之类的操作的表达式中使用时,不会激活隐式生成。 在这些情况下,现在必须继续使用 yield

通配符标识符

在涉及类的 F# 代码中,成员声明中的自我标识符始终需要是显式的。 但在从未使用自我标识符的情况下,传统上习惯使用双下划线来指示无名称自我标识符。 现在可以使用单下划线:

type C() =
    member _.M() = ()

这也适用于 for 循环:

for _ in 1..10 do printfn "Hello!"

缩进放宽

在 F# 4.7 之前,主构造函数和静态成员参数的缩进要求所需的缩进过多。 它们现在只需要单个缩进范围:

type OffsideCheck(a:int,
    b:int, c:int,
    d:int) = class end

type C() =
    static member M(a:int,
        b:int, c:int,
        d:int) = 1