F# class 显式字段和默认值

F# class Explicit Fields and DefaultValue

这是一道 F# 语言定义题。 我想知道为什么 F# 不能首先自动推断出显式字段?然后 DefaultValue 也会自动...

为什么要有另一个 class 语法(在 F# 中有这么多语法)...而不是没有值(但有类型)的 let 绑定字段可以自动解释为 (的意思)val。此外,当默认构造函数旁边需要默认值时,为什么不自动推导它呢?

let myInt1 : int 解释为以下含义: val myInt1 : int 要么 [<DefaultValue>] val myInt : int

最后(可能是一个不同的主题,因此请将其视为一个小问题),为什么显式字段(或 public 字段)需要在成员方法中引用自标识符?同样,class 实现语法失去了很多简单性。

谢谢!

我并不声称理解所有你的问题。

显式字段自然不能从值中推断出来,因为没有值;它是未初始化的。所以你需要给一个类型。

let myInt : int 没有意义,因为 let 需要一个值。

我同意你的最后一点,val 可以很容易地在范围内并且不需要 this 限定符,但要遵守正常的隐藏规则。

很好奇您将如何强制初始化 val mutable 字段:

type MyClass private () =
    [<DefaultValue>] val mutable v:int

    new (v:int) as this = MyClass() then this.v <- v

这使得主构造函数成为私有的,因此必须使用 new (v:int)new (v:int) as this 定义的形式让您首先调用主构造函数并使用 then ... this.v <- ...

初始化 val mutable

F# language reference on constructors 最有帮助。