如果我们将类别的理解限制为 Haskell 中通常的 Category
类:
class Category c where
id :: c x x
(>>>) :: c x y -> c y z -> c x z
那么我们可以说,Arrow
是一个 Category
,它还可以额外执行以下操作:
class Category c => Arrow c where
(***) :: c x y -> c x' y' -> c (x,x') (y,y')
(&&&) :: c x y -> c x y' -> c x (y,y')
我们可以轻易地推导出:
first :: c x y -> c (x,z) (y,z)
first a = a *** id
second :: c x y -> c (z,x) (z,y)
second a = id *** a
或者我们可以从first
和second
中推导出(***)
:
a1 *** a2 = first a1 >>> second a2
我们也可以推导出:
dup :: c x (x,x)
dup = id &&& id
或者我们可以通过 dup
和 (***)
推出 (&&&)
:
a1 &&& a2 = dup >>> (a1 *** a2)
我的观点和问题是:
如果没有 arr
,Arrow
还有什么意义和用处呢?它似乎非常连贯和有用。除了范畴定律之外,还有哪些箭头定律不涉及 arr
并在此保持不变呢?这一切在范畴论中意味着什么?
我基本上从 Reddit 偷了这个问题,并加以概括和阐述:http://www.reddit.com/r/haskell/comments/2e0ane/category_with_fanout_and_split_but_not_an_arrow/
Morphism
。即使没有函数,一些法则仍然有意义...像fst
或const
这样的东西是该包中其他类的方法,并且需要使用它们来正确地制定法律。我会感到惊讶如果Edward、Conal或其他人没有在某个地方已经做过了,但是我不知道用哪个名字... - leftaroundabout