zer*_*ing 4 haskell scala tuples either category-theory
我正在尝试了解Product和Coproduct对应于以下图片:
副产品:
据我了解,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)
如何理解Sum与Product类型有关的图像?
图片来自http://blog.higher-order.com/blog/2014/03/19/monoid-morphisms-products-coproducts/。
据我所知,这些图表背后的想法是:
A,B和Zf和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 函数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),用fst和snd提取(“伸出”在数学术语)的第一和第二部件,然后h z = (f z, g z, x)为任何这样的功能x :: Int你关心到名称。
自从我学习数学,特别是范畴论以来,已经太久了,无法证明这对(A, B)是唯一满足我们正在谈论的“普遍性质”的类型——但请放心,它确实是,而且你真的为了能够在 Haskell 中使用 product 和 sum 类型进行编程,不需要理解(或真正理解其中的任何一个)。
第二个图或多或少相同,但所有的箭头都颠倒了。在这种情况下,“副产物”或“总和”M的A并B证明是Either a b(或东西isomoprhic到它),以及h :: M -> Z将其定义为:
h (Left a) = f a
h (Right b) = g b
Run Code Online (Sandbox Code Playgroud)