F#class显式字段和DefaultValue

时间:2015-04-06 14:48:24

标签: f#

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

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

val 解释为: let myInt1 : int 要么 val myInt1 : int

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

显然字段当然不能从值中推断出来,因为没有值;它没有被初始化。所以你需要提供一种类型。

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

我最后一点同意你的意见,val可以很容易地在范围内而且不需要this限定符,这取决于正常的阴影规则。

答案 1 :(得分:0)

很好奇您将如何强制初始化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定义的形式,您可以首先调用主构造函数并使用val mutable

初始化then ... this.v <- ...

F# language reference on constructors最有用。