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

时间:2017-12-11 06:48:05

标签: haskell

总和类型

while read var do echo "s/"$var"//g" >> sed.script2 done < 1.txt sed --file=sed.script2 2.txt > 3.txt rm -f sed.script 类型是和类型。

Maybe Int

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

产品类型

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

Just

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

data Colour = Person String Int

2 个答案:

答案 0 :(得分:12)

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

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

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

因此,有时我们的data是一小部分产品的非平凡总和,我们称之为“总和”;有时它是一些微不足道的非平凡产品,我们称之为“产品”。但是,在一般情况下,它始终是“产品之和”。

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

答案 1 :(得分:2)

Maybe Int类型是和类型,因为它具有替换

data SumType = This | That

它在其构造函数上有参数的事实不会影响它的“总和”。 Sum类型还可以包含产品构造函数,例如:

type Username = String
type Email    = String
-- User is a sum of three products
data User = NotLoggedIn                    -- nullary constructor
          | Guest Username                 -- unary constructor
          | RegisteredUser Username Email  -- binary constructor