首页 > 解决方案 > 了解产品和副产品的图表

问题描述

我试图理解ProductCoproduct对应于下图:

产品: 在此处输入图像描述

副产品:

在此处输入图像描述

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

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/

标签: scalahaskelltuplescategory-theoryeither

解决方案


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

  • 类型ABZ
  • 指定类型的函数fg(在第一个图中,f :: Z -> Ag :: Z -> B,在第二个图中,箭头指向“另一种方式”,所以f :: A -> Zg :: B -> Z)。

我现在将专注于第一个图表,这样我就不必把每件事都说两遍了。

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

很容易看出,不管是什么Z,pair type (A, B),连同通常的 Haskell 函数fstsnd,都满足了这一点——再加上适当的 选择h,即:

h z = (f z, g z)

它简单地满足了图表通勤所需的两个身份。

这是对图表的基本解释。但是你可能Z对这一切中的角色有点困惑。之所以出现这种情况,是因为实际陈述的内容相当强大。就是,给定A、和B,有一个与函数和,您可以为任何类型构建这样的图(这意味着也提供一个函数)。此外,只有一个函数可以满足所需的属性。fgMfstsndZh :: Z -> Mh

很明显,一旦您使用它并理解了各种要求,pair(A, B)以及与其同构的各种其他类型(这基本上意味着MyPair A B您定义的位置data MyPair a b = MyPair a b)是唯一满足这一点的东西。还有其他类型M也可以工作,但会给出各种不同h的 s - 例如。采取M三元组(A, B, Int)fstsnd提取(数学术语中的“投影到”)第一个和第二个组件,然后对于您想命名h z = (f z, g z, x)的任何人来说都是这样的函数。x :: Int

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

第二张图大致相同,但所有箭头都颠倒了。M在这种情况下,A和的“副产品”或“总和”B结果是Either a b(或与之等量的东西),h :: M -> Z并将被定义为:

h (Left a) = f a
h (Right b) = g b

推荐阅读