我试图了解与以下图片相对应的ProductCoproduct:

产品:
scala - 了解产品和副产品图-LMLPHP

副产品:

scala - 了解产品和副产品图-LMLPHP

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

data Pair = P Int Double

Sum类型为:
data Pair = I Int | D Double

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

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

最佳答案

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

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

  • 现在,我将专注于第一个图,这样我就不必在稍有变化的情况下重复两次。

    无论如何,鉴于上述情况,我们的想法是存在一个M类型以及函数fst :: M -> Asnd :: M -> Bh :: Z -> M,如数学家所说,该图可以“换向”。这仅表示在给定图中的任何两个点的情况下,如果您以任何方式遵循箭头的指示,则得到的功能是相同的。也就是说,ffst . h相同,gsnd . h相同

    不难看出,无论是什么Z,该对类型(A, B)以及通常的Haskell函数fstsnd都能满足此要求-以及h的适当选择,即:
    h z = (f z, g z)
    

    它简单地满足了要转换的两个必需身份。

    这是该图的基本说明。但是您可能对Z在所有这一切中的作用有些困惑。之所以会出现这种情况,是因为实际上所说的要强大得多。就是说,给定ABfg,有一个M以及函数fstsnd,您可以为任何类型的Z构造这样的图(这意味着还提供函数h :: Z -> M)。此外,只有一个函数h可以满足所需的属性。

    很显然,一旦您使用了它并理解了各种要求,对(A, B)和其他与它同构的其他类型(基本上就是您在其中定义了MyPair A Bdata MyPair a b = MyPair a b)就可以满足这一要求。并且还有其他类型的M也可以使用,但是会给出各种不同的h-例如。以M为三重(A, B, Int),并从fstsnd提取(在数学术语中为“projecting to”)的第一部分和第二部分中,然后h z = (f z, g z, x)就是您想要命名的任何x :: Int的函数。

    自从我学习数学(尤其是类别理论)以来,已经太久了,无法证明(A, B)对是满足我们所讨论的“通用属性”的唯一类型-但请放心,事实是,您为了能够在Haskell中使用乘积和求和类型进行编程,确实不需要理解(或其中的任何一种)。

    第二张图大致相同,但所有箭头都相反。在这种情况下,MA的“coproduct”或“sum” B变成Either a b(或与之等价的东西),并且h :: M -> Z将定义为:
    h (Left a) = f a
    h (Right b) = g b
    

    09-26 14:21