我对理论设定的答案真的更感兴趣。所以也许我应该问int * int vs int + int。我将int * int解释为具有int平方的基数的元组作为组合的数量。
答案 0 :(得分:4)
如果您想了解有关该理论的更多信息,可以搜索有关产品类型的信息(元组是基本案例,记录是标记为产品)和< em> sum类型(F#中的Choice<..>
类型是基本情况,受区分的联合标记为和类型。)
集合理论解释是产品类型对应于集合的乘积,而和类型对应于并集(更准确地说是disjoint union - 因为它们被标记)。
因此,假设[| T |]
是表示类型T
的值的集合:
[| T 1 * T 2 |] = {(v 1 ,v 2 )| v 1 ∈[| T 1 |],v 2 ∈[| T 2 |]}
[| T 1 + T 2 |] = {(1,v)| v∈[| T 1 |]}∪{(2,v)| v∈[| T 2 |]}
+
操作的简单版本只是union,但只有在两种类型具有不同的值时才有意义(因此您可以区分没有标签):
[| T 1 + T 2 |] = [| T 1 |]∪[| T 2 |]
这实际上非常有趣,因为您可以发现许多标准代数定律也适用于类型。例如,分配说:(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
的值之间进行映射的函数。事实上,你甚至可以更狂野甚至区分类型。这有点疯狂,但你要求一个理论:http://www.cs.nott.ac.uk/~txa/publ/jpartial.pdf
答案 1 :(得分:1)
是的,记录类型就像元组类型一样,只是它们的元素有名字。正如元组类型的F#/ ML语法所示,类型为A * B * C * ...
的元组具有| A | * | B | * | C | * ......可能的值。同样,你也是对的,有歧视的联盟| N1 of A | N2 of B | ...
有| A | + | B | + ......可能的值。你没有提到它,但函数类型对应于取幂:A -> B
有| B | | A | 居民。