Math 类型a={X:int;Y:int}vs类型a=|X of int | Y of int

Math 类型a={X:int;Y:int}vs类型a=|X of int | Y of int,math,f#,set,Math,F#,Set,我对理论上的答案更感兴趣。因此,也许我应该问int*int vs int+int。我将int*int解释为一个元组,其中int的基数平方表示组合的数量。是的,记录类型与元组类型类似,只是它们的元素有名称。正如元组类型的F#/ML语法所示,类型为a*B*C*…的元组具有| a |*| B |*| C*。。。可能的值。同样地,你也对了,一个受歧视的联合|N1的a | N2的B |…有| a |+| B |+。。。可能的值。您没有提到它,但函数类型对应于求幂:A->B有| B | | A |居民。是的

我对理论上的答案更感兴趣。因此,也许我应该问int*int vs int+int。我将int*int解释为一个元组,其中int的基数平方表示组合的数量。

是的,记录类型与元组类型类似,只是它们的元素有名称。正如元组类型的F#/ML语法所示,类型为
a*B*C*…
的元组具有| a |*| B |*| C*。。。可能的值。同样地,你也对了,一个受歧视的联合
|N1的a | N2的B |…
有| a |+| B |+。。。可能的值。您没有提到它,但函数类型对应于求幂:
A->B
有| B | | A |居民。

是的,记录类型与元组类型类似,只是它们的元素有名称。正如元组类型的F#/ML语法所示,类型为
a*B*C*…
的元组具有| a |*| B |*| C*。。。可能的值。同样地,你也对了,一个受歧视的联合
|N1的a | N2的B |…
有| a |+| B |+。。。可能的值。您没有提到它,但函数类型对应于求幂:
A->B
有| B | | A |居民。

如果您想了解更多有关该理论的信息,可以搜索有关乘积类型(元组是基本情况,记录被标记为乘积)和求和类型的信息(F#中的
选项
类型是一种基本情况,区分的并集被标记为和类型)

集合理论的解释是,乘积类型对应于集合的乘积,和类型对应于一个并集(更准确地说是a-,因为它们有标签)

因此,假设
[|T |]
是一个表示
T
类型值的集合:

[| T1*T2 |]={(v1,v2)| v1∈ [| T1 |],v2∈ [| T2 |]}
[| T1+T2 |]={(1,v)| v∈ [| T1 |]]∪ {(2,v)|v∈ [| T2 |]]

+
操作的更简单版本是union,但这只有在两种类型具有不同值时才有意义(因此您可以区分没有标签的情况):

[| T1+T2 |]=[| T1 |]∪ [| T2 |]

这实际上很有趣,因为你可以发现许多标准代数定律也适用于类型。例如,分布性说:
(a+b)*c=(a*c)+(b*c)
。这也适用于类型,这意味着以下两个是等价的:

type AorB = A of int | B of string            // int + string
type AorBandC = AorB * float                  // (int + string) * float

type AandC = int * float                      // int * float
type BandC = string * float                   // string * float
type AandCorBandC = AC of AandC | BC of BandC // (int * float) + (string * float)

你可以编写一对函数,在
AorBandC
AandCorBandC
的值之间进行映射。事实上,你可以更加随意,甚至可以区分类型。这有点疯狂,但你需要一个理论:

如果你想了解更多关于这个理论的信息,你可以搜索关于产品类型的信息(元组是基本情况,记录被标记为乘积)和和和类型(F#中的
选项
类型是基本情况,区分的并集被标记为和类型)

集合理论的解释是,乘积类型对应于集合的乘积,和类型对应于一个并集(更准确地说是a-,因为它们有标签)

因此,假设
[|T |]
是一个表示
T
类型值的集合:

[| T1*T2 |]={(v1,v2)| v1∈ [| T1 |],v2∈ [| T2 |]}
[| T1+T2 |]={(1,v)| v∈ [| T1 |]]∪ {(2,v)|v∈ [| T2 |]]

+
操作的更简单版本是union,但这只有在两种类型具有不同值时才有意义(因此您可以区分没有标签的情况):

[| T1+T2 |]=[| T1 |]∪ [| T2 |]

这实际上很有趣,因为你可以发现许多标准代数定律也适用于类型。例如,分布性说:
(a+b)*c=(a*c)+(b*c)
。这也适用于类型,这意味着以下两个是等价的:

type AorB = A of int | B of string            // int + string
type AorBandC = AorB * float                  // (int + string) * float

type AandC = int * float                      // int * float
type BandC = string * float                   // string * float
type AandCorBandC = AC of AandC | BC of BandC // (int * float) + (string * float)

你可以编写一对函数,在
AorBandC
AandCorBandC
的值之间进行映射。事实上,你可以更随意,甚至可以区分类型。这有点疯狂,但你需要一个理论:

我认为int*int的可能值的数量应该是nCr(| int |,2)。抱歉在此发表评论。我无法对答案发表评论。但我看不到int*int和int+int的可能值之间的区别。至于
A*B
A+B
之间的区别,第一种类型的可能值是
(A_I,B_j)
而第二个值是
xa_i
yb_j
。这有帮助吗?我想我回答了我的问题。在声明后处理| X of int | Y of int时,一次只处理一个子集(X或Y).对于一个产品类型,您同时处理两个变量。我不能回答我自己的问题,但我认为这是我的答案。是的,这确实有帮助。我认为我们说的是同一件事。我认为int*int的可能值的数量应该是nCr(| int |,2)。抱歉在此发表评论。我无法对答案发表评论。但我看不到int*int和int+int的可能值之间的区别。至于
A*B
A+B
之间的区别,第一种类型的可能值是
(A_I,B_j)
而第二个值是
xa_i
yb_j
。这有帮助吗?我想我回答了我的问题。在声明后处理| X of int | Y of int时,一次只处理一个子集(X或Y).对于一种产品类型,您同时处理两个变量。我不能回答我自己的问题,但我认为这是我的答案。是的,这确实有帮助。我认为我们说的是同一件事。