type a = {X:int; Y:int} vs type a = | int of int | Y of int

时间:2013-04-25 21:24:02

标签: math f# set

我对理论设定的答案真的更感兴趣。所以也许我应该问int * int vs int + int。我将int * int解释为具有int平方的基数的元组作为组合的数量。

2 个答案:

答案 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)

您可以编写一对将在AorBandCAandCorBandC的值之间进行映射的函数。事实上,你甚至可以更狂野甚至区分类型。这有点疯狂,但你要求一个理论: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 | 居民。