scala - 了解产品和副产品的图表
问题描述
我试图理解Product
和Coproduct
对应于下图:
副产品:
据我了解,Product
Haskell 中的一个类型例如是:
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
,pair type (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
很明显,一旦您使用它并理解了各种要求,pair(A, B)
以及与其同构的各种其他类型(这基本上意味着MyPair A B
您定义的位置data MyPair a b = MyPair a b
)是唯一满足这一点的东西。还有其他类型M
也可以工作,但会给出各种不同h
的 s - 例如。采取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
(或与之等量的东西),h :: M -> Z
并将被定义为:
h (Left a) = f a
h (Right b) = g b
推荐阅读
- javascript - 更改在 Javascript 中作为参数传递的变量
- angular - 如何在一列中显示多个值?
- android - 在 OpenCV android 应用程序中启用“libc++_shared.so”
- java - Javassist - CtMethod 方法体中的数值操作抛出 java.lang.VerifyError
- r - 如何订购酒吧ggplot2 facet_wrap
- performance - 为什么导航/菜单栏需要很长时间才能加载?
- cmake - 如何让Cmake输出相对路径?
- python - 如何将回调传递给 re.sub,但仍插入匹配捕获?
- listview - 将小部件添加到 List 时 Flutter ListView 无法正常工作
- amazon-web-services - 将具有 Glacier 存储类的 S3 文件移动到其他文件夹