了解产品和副产品图

zer*_*ing 4 haskell scala tuples either category-theory

我正在尝试了解ProductCoproduct对应于以下图片:

产品: 在此处输入图片说明

副产品:

在此处输入图片说明

据我了解,ProductHaskell中的类型例如:

data Pair = P Int Double
Run Code Online (Sandbox Code Playgroud)

Sum类型是:

data Pair = I Int | D Double 
Run Code Online (Sandbox Code Playgroud)

如何理解SumProduct类型有关的图像?

图片来自http://blog.higher-order.com/blog/2014/03/19/monoid-morphisms-products-coproducts/

Rob*_*ond 6

据我所知,这些图表背后的想法是:

  • 类型ABZ
  • 功能fg指示的类型(在第一个图中,f :: Z -> Ag :: Z -> B,在第二个图中,箭头指向“相反的方向”,所以f :: A -> Zg :: B -> Z)。

现在我将专注于第一个图表,这样我就不必在略有变化的情况下重复所有内容。

无论如何,考虑到上述情况,想法是有一个类型M与函数fst :: M -> Asnd :: M -> B,以及h :: Z -> M数学家所说的那样,图表“通勤”。这只是意味着,给定图中的任何两点,如果您以任何方式从一个箭头到另一个,结果函数是相同的。也就是说,f是相同的 fst . hg是相同的snd . h

很容易看出,无论是什么Z,对类型(A, B),连同通常的 Haskell 函数fstand snd,都满足这一点 - 再加上适当的 选择h,即:

h z = (f z, g z)
Run Code Online (Sandbox Code Playgroud)

这微不足道地满足了图通勤所需的两个身份。

这是图表的基本解释。但是您可能对Z所有这些中的角色感到有些困惑。之所以出现这种情况,是因为实际陈述的内容要强得多。正是给定A, B, fand g,有一个M与函数fstand一起snd,你可以为任何类型构造这样的图Z(这意味着也提供一个函数h :: Z -> M)。此外,只有一个函数h满足所需的属性。

很明显,一旦您使用它并理解了各种要求,那么 pair(A, B)和与它同构的各种其他类型(这基本上意味着MyPair A B您定义的地方data MyPair a b = MyPair a b)是唯一满足这一点的东西。并且还有其他类型M也可以使用,但是会给出各种不同的hs - 例如。采取M为三(A, B, Int),用fstsnd提取(“伸出”在数学术语)的第一和第二部件,然后h z = (f z, g z, x)为任何这样的功能x :: Int你关心到名称。

自从我学习数学,特别是范畴论以来,已经太久了,无法证明这对(A, B)是唯一满足我们正在谈论的“普遍性质”的类型——但请放心,它确实是,而且你真的为了能够在 Haskell 中使用 product 和 sum 类型进行编程,不需要理解(或真正理解其中的任何一个)。

第二个图或多或少相同,但所有的箭头都颠倒了。在这种情况下,“副产物”或“总和”MAB证明是Either a b(或东西isomoprhic到它),以及h :: M -> Z将其定义为:

h (Left a) = f a
h (Right b) = g b
Run Code Online (Sandbox Code Playgroud)


mic*_*hid 5

产品(Tuple在Haskell中)是具有两个投影的对象。这些都是功能突出的产品到他们的个人因素fstsnd

相反,副产品(Either在Haskell中)是具有两次注入的对象。这些是各个求和项注入lefts和中的函数rights

注意,产品和副产品都需要满足通用属性。我推荐Bartosz Milewski 对该主题的介绍以及他的演讲