我试图了解与以下图片相对应的Product
和Coproduct
:
产品:
副产品:
据我了解,Haskell中的Product
类型例如:
data Pair = P Int Double
且
Sum
类型为:data Pair = I Int | D Double
如何理解与
Sum
和Product
类型有关的图像?图像来自http://blog.higher-order.com/blog/2014/03/19/monoid-morphisms-products-coproducts/。
最佳答案
据我所知,这些图背后的想法是给您:
A
,B
和Z
f
和g
(在第一张图中,f :: Z -> A
和g :: Z -> B
,在第二张图中,箭头“相反”,所以f :: A -> Z
和g :: B -> Z
)。 现在,我将专注于第一个图,这样我就不必在稍有变化的情况下重复两次。
无论如何,鉴于上述情况,我们的想法是存在一个
M
类型以及函数fst :: M -> A
,snd :: M -> B
和h :: Z -> M
,如数学家所说,该图可以“换向”。这仅表示在给定图中的任何两个点的情况下,如果您以任何方式遵循箭头的指示,则得到的功能是相同的。也就是说,f
与fst . h
相同,g
与snd . h
相同不难看出,无论是什么
Z
,该对类型(A, B)
以及通常的Haskell函数fst
和snd
都能满足此要求-以及h
的适当选择,即:h z = (f z, g z)
它简单地满足了要转换的两个必需身份。
这是该图的基本说明。但是您可能对
Z
在所有这一切中的作用有些困惑。之所以会出现这种情况,是因为实际上所说的要强大得多。就是说,给定A
,B
,f
和g
,有一个M
以及函数fst
和snd
,您可以为任何类型的Z
构造这样的图(这意味着还提供函数h :: Z -> M
)。此外,只有一个函数h
可以满足所需的属性。很显然,一旦您使用了它并理解了各种要求,对
(A, B)
和其他与它同构的其他类型(基本上就是您在其中定义了MyPair A B
的data MyPair a b = MyPair a b
)就可以满足这一要求。并且还有其他类型的M
也可以使用,但是会给出各种不同的h
-例如。以M
为三重(A, B, Int)
,并从fst
和snd
提取(在数学术语中为“projecting to”)的第一部分和第二部分中,然后h z = (f z, g z, x)
就是您想要命名的任何x :: Int
的函数。自从我学习数学(尤其是类别理论)以来,已经太久了,无法证明
(A, B)
对是满足我们所讨论的“通用属性”的唯一类型-但请放心,事实是,您为了能够在Haskell中使用乘积和求和类型进行编程,确实不需要理解(或其中的任何一种)。第二张图大致相同,但所有箭头都相反。在这种情况下,
M
和A
的“coproduct”或“sum” B
变成Either a b
(或与之等价的东西),并且h :: M -> Z
将定义为:h (Left a) = f a
h (Right b) = g b