为什么我需要在 F# 中的这个字典初始值设定项中使用括号

why do I need parenthesis in this dictionary initializer, in F#

这些类型:

type A =
    | AA
    | AB

type B =
    Dictionary<int, int>()

我初始化一个字典:

Dictionary<A, B>(dict [ (A.AA, B()); (A.AB, B()) ])

但是我不明白为什么在初始化代码中B后面要加括号

以下:

Dictionary<A, B>(dict [ (A.AA, B); (A.AB, B) ])

不会编译。我知道 'B' 可能代表类型,'B()' 代表它的一个实例,但我不明白为什么 '()' 会代表一个实例?

作为附加问题:

type B =
    Dictionary<int, int>()

type B =
    Dictionary<int, int>

两者似乎都有效。两者中的任何一个都是首选,如果是,为什么?

首先,声明type B = Dictionary<int, int>()对我不起作用。我收到错误“成员定义中的意外符号'('”,正如我所料。你确定它对你有用吗?你使用的是哪个版本的 F#?

类型 Dictionary<_,_>class。 类 与有区别的联合不同(类型 A 是)。它们是另一种类型。

特别是,要创建 class 类型的值,需要调用构造函数并向其传递一些参数。这正是您在自己的代码中所做的:

Dictionary<A, B> (dict [ (A.AA, B()); (A.AB, B()) ])
^--------------^ ^---------------------------------^
    |                      |
 constructor               |
                           |
                        parameter passed to the constructor

一些 classes 有多个构造函数。 Dictionary 就是其中一种类型。

有些构造函数没有参数,但你还是要调用它们。这就是你对空括号所做的。

F# 将无参数 .NET 方法和构造函数建模为具有单个参数的函数,并且该参数的类型为单元。这就是你说 B()

时所做的事情
B ()
^ ^^
|  |
|  single parameter of type unit
|
constructor

如果你只是说 B 没有参数,那么你得到的是一个 unit -> B 类型的函数——这是一个需要一个 unit 类型参数的函数,并且当你传递这样的参数时,它会 return 你一个 B.

类型的值