Dictionary 为什么在这个字典初始值设定项中需要括号,在F中#

Dictionary 为什么在这个字典初始值设定项中需要括号,在F中#,dictionary,f#,initialization,Dictionary,F#,Initialization,对于这些类型: type A = | AA | AB type B = Dictionary<int, int>() A型= |AA |AB B型= 字典() 我初始化字典: Dictionary<A, B>(dict [ (A.AA, B()); (A.AB, B()) ]) 字典(dict[(A.AA,B());(A.AB,B())) 但我不明白为什么在初始化代码中需要在B之后加括号 以下是: Dictionary<A, B&g

对于这些类型:

type A =
    | AA
    | AB

type B =
    Dictionary<int, int>()
A型=
|AA
|AB
B型=
字典()
我初始化字典:

Dictionary<A, B>(dict [ (A.AA, B()); (A.AB, B()) ])
字典(dict[(A.AA,B());(A.AB,B())) 但我不明白为什么在初始化代码中需要在B之后加括号

以下是:

Dictionary<A, B>(dict [ (A.AA, B); (A.AB, B) ])
字典(dict[(A.AA,B);(A.AB,B)]) 不会编译。我知道'B'可能代表类型,'B()'是它的一个实例,但我不明白为什么'()'会代表实例

作为补充问题:

type B =
    Dictionary<int, int>()
B型=
字典()

B型=
字典

两者似乎都有效。这两种语言中有哪一种是首选的,如果是,原因是什么?

首先,声明
type B=Dictionary()
对我不起作用。我得到了一个错误“Unexpected symbol”(“in member definition”),这正是我所期望的。您确定它对您有效吗?您使用的是哪个版本的F#

类型
Dictionary
是一个类。类与区别联合(类型
a
是)不同。它们是一种不同的类型

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

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

如果你只说没有参数的
B
,那么你得到的是
unit->B
类型的函数-这是一个需要一个
unit
类型的单个参数的函数,当你传递这个参数时,它将返回一个
B

类型的值首先,声明
类型B=Dictionary()
对我不起作用。我得到了一个错误“意外符号”(“在成员定义中”),与我预期的完全一致。你确定它对你起作用吗?你使用的是哪个版本的F#

类型
Dictionary
是一个类。类与区别联合(类型
a
是)不同。它们是一种不同的类型

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

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

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

类型的值,你把类型和值混淆了。
B
是一个类型e、
B()
是一个值我知道这是实际发生的事情,但我并不真正理解语法。例如,在第二个问题中,()有什么区别?在第一个问题中,我知道B是类型,B()是该类型的一个实例,但我不知道“()”语法,因为我已经习惯了()在F中表示“nothing”,它不是“nothing”,而是Unit你把类型和值混淆了。
B
是一个类型,
B()
是一个值我知道这是实际发生的事情,但我并不真正理解语法。例如,在第二个问题中,()是吗?在第一个问题中,我知道B是类型,B()是该类型的实例,但我不知道“()”语法,因为我已经习惯了()在F中表示“nothing”,它不是“nothing”,我想我理解混淆的地方:我真的应该把类型B看作是一个宏的等价物,其中B被替换为它的内容(字典类)这需要实例化。我想部分混淆是因为关键字类型在不同的场景中使用,它创建了不同类型的实体。为了回答您的第一个问题,我在macOS的Jupyter实验室编译了代码;它没有告诉我它是使用.net core还是mono,但我确认(刚刚重新测试)我想我明白了混淆的地方:我真的应该把类型B看作是一个宏的等价物,在宏中B被替换为它的内容(字典类)这需要实例化。我想部分混淆是因为关键字类型在不同的场景中使用,它创建了不同类型的实体。为了回答您的第一个问题,我在macOS的Jupyter实验室编译了代码;它没有告诉我它是使用.net core还是mono,但我确认(刚刚重新测试),它使用括号编译。
B ()
^ ^^
|  |
|  single parameter of type unit
|
constructor