我正在研究Bartosz Milewski关于类别理论的出色博客。我被困在products and coproducts上。
Bartosz说,两个对象a
和b
的乘积是带有两个投影的对象c
,因此对于任何其他带有两个投影的对象c'
是从m
到c'
的唯一变态c
,将这些投影分解。
我们当然可以在集合和函数的类别中找到合适的示例。 Int
和Bool
这两种类型的乘积是(Int, Bool)
对。这两个投影分别是p (int, _) = int
和q (_, bool) = bool
。但是,Int
和Bool
乘积的另一个候选者:类型为Int
,投影为p' int = int
和q' _ = True
。正如Bartosz所说:“虽然很la脚,但符合条件。”请注意,产品类型Int
包含的值少于产品类型(Int, Bool)
。准确地说是一半。即使两种产品类型都可以映射到整个Int
类型,但是产品类型Int
可以映射到Bool
类型的一半。它不是形容词(如果这是正确的词)!
因为我们可以提出一种m :: (Int, Bool) -> Int
的简单用法(其中m
只能唯一地实现为m (int, _) = int
),所以我们知道产品类型{{ 1}}比(Int, Bool)
更好。在这一点上,我想知道:难道我们不能像Int
那样容易地实现m
吗?那不是第二种态吗?还是不允许这样做,因为得到的乘积m (int, _) = int + 1
实际上根本不是Int
,而是Int
被“移位了” 1?
L
答案 0 :(得分:1)
m
中的箭头指向错误的方向。我们知道(Int, Bool)
比Int
“更好”,因为我们有一个态射m :: Int -> (Int, Bool)
,m x = (x, True)
。它满足p . m == p'
和q . m == q'
的条件,这就是m
分解 p'
和q'
的含义。如果您以其他任何方式定义m
,则此条件将不成立。
例如,如果将其定义为m x = (x + 1, True)
,则定义为p (m 0) == 1
,但是定义为p' 0 == 0
。
您的地图m' :: (Int, Bool) -> Int
如果将p
和q
分解,也将指出Int
是合适的产品。但是合成q' . m' :: (Int, Bool) -> Bool
始终返回True
,因此它不能等于q
。