试图理解F#类定义语法

And*_*dry 6 .net syntax f# constructor

在了解了这门语言最重要的功能后,我现在正在接近F#课程.那么,类定义语法并不容易理解,但是现在我清楚了一些主要概念,但其他概念却没有.

1)我想知道的第一件事就是正确/不正确.我知道可以用两种方式定义类:

  • 隐含的类.这些类只有一个构造函数,在类的第一行中,有必要使用let绑定定义所有内部变量,为它们赋值.
  • 显式类.这些类有许多构造函数.它们通过val绑定接受未初始化的值.这些值必须在构造函数中初始化.如果构造函数无法为使用val绑定定义的至少一个私有变量定义值,编译器就会生气.

这是对的吗???

2)我在理解显式类中构造函数的语法时遇到问题.考虑以下:

这是第一个版本:

(* COMPILES :) *)
type MyType =
   val myval: int
   val myother: int
   (* Constructor *)
   new (a: int, b: int) = {
      myval = a;
      myother = b;
   }
Run Code Online (Sandbox Code Playgroud)

这是第二个版本:

(* COMPILES :) *)
type MyType =
   val myval: int
   val myother: int
   (* Constructor *)
   new (a: int, b: int) = {
      myval = a (* No semicolon *)
      myother = b (* No semicolon *)
   }
Run Code Online (Sandbox Code Playgroud)

这是最后一个版本:

(* DOES NOT COMPILE :( *)
type MyType =
   val myval: int
   val myother: int
   (* Constructor *)
   new (a: int, b: int) = 
      myval = a (* Using the normal indent syntax, without {} *)
      myother = b (* Using the normal indent syntax, without {} *)
Run Code Online (Sandbox Code Playgroud)

我不明白为什么前两个版本编译而第三个使用常规缩进语法却没有.此问题仅在构造函数中发生,因为在成员上我可以使用缩进语法

(* COMPILES :) *)
type MyType =
   val myval: int
   val myother: int
   (* Constructor *)
   new (a: int, b: int) = {
      myval = a (* No semicolon *)
      myother = b (* No semicolon *)
   }
   (* Indentation accepted, no {} to be inserted *)
   member self.mymember =
      let myvar = myval
      myvar + 10
Run Code Online (Sandbox Code Playgroud)

为什么新函数(构造函数)需要{}括号????? 我不喜欢它,因为它似乎考虑了一个序列.此外,我的代码也在{}球拍中,在一条指令和另一条指令之间插入时没有分号.为什么????

kvb*_*kvb 2

关于2),构造函数的主体与典型函数的主体不同 - 它具有受限制的语法形式,并且在该{ }部分中它只能包含对父构造函数的调用和字段的赋值(类似于记录构造) 。{ }定义普通成员时,即使您愿意,也不能将各个表达式包装起来(也就是说,在这种情况下大括号不是可选的,它们是被禁止的)。