"RGB Int Int Int | Transparent"是总和还是产品类型?

the*_*ode 0 haskell

总和类型

Maybe Int类型是总和类型.

data Maybe Int = Nothing | Just Int
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这是因为Nothing值构造函数不带参数,而第二个值构造函数Just只接受一个参数.因此,因为没有值构造函数需要多个参数,所以此类型是产品类型.

产品类别

下面的类型是产品类型,因为它的数据构造函数有两个参数,因此是产品类型.

data Colour = Person String Int
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何在总和和产品类型的上下文中对以下类型进行分类.我们该如何参考?

data Shade = RGB Int Int Int | Transparent
Run Code Online (Sandbox Code Playgroud)

chi*_*chi 12

所有data类型都是"产品总和".我们总结了构造函数的数量,并且对于每个构造函数,我们乘以参数的数量.

有时总和是微不足道的.如果只有一个构造函数,或者根本没有构造函数,我们总结一个单例或空集.对单个构造函数求和使得结果类型与产品同构.总结没有构造函数使得类型为空(例如Data.Void.Void).

有时,一些产品也是微不足道的.当存在单个参数或根本没有参数时,我们乘以单个参数或空集.乘以单个参数T只会产生T(提升后).乘以无参数会产生只有一个值的类型(例如()).

因此,有时我们data的琐碎产品是非常重要的,我们称之为"总和"; 有时它是一些微不足道的非平凡产品,我们称之为"产品".但是,在一般情况下,它始终是"产品之和".

请注意,代数类型(直到同构)形成了一个可交换的半环,满足了高中代数与求和和产品大致相同的规律.在高中代数中,我们可以将涉及嵌套和和乘积的任何表达式转换为多项式,即转换为"乘积之和".这也适用于类型(直到同构),因此选择使data类型成为"产品的总和"是相当富​​有表现力的.