为什么我需要在 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
.
类型的值
这些类型:
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
.