如果我们将我们对类别的理解限制为Category
Haskell 中的普通类:
class Category c where
id :: c x x
(>>>) :: c x y -> c y z -> c x z
然后假设 anArrow
是一个Category
which can 另外:
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
and派生second
:
a1 *** a2 = first a1 >>> second a2
我们还可以得出:
dup :: c x (x,x)
dup = id &&& id
或者我们可以推导出(&&&)
给定的dup
and (***)
:
a1 &&& a2 = dup >>> (a1 *** a2)
我的观点是什么,我的问题是什么?是这样的:
Arrow
没有什么arr
?它似乎完全连贯且有用。是否有任何箭头法则(除了类别法则之外)不涉及arr
并且在这里保持完整?这在范畴论中意味着什么?
我基本上从reddit偷了这个问题,但对其进行了概括和阐述: http ://www.reddit.com/r/haskell/comments/2e0ane/category_with_fanout_and_split_but_not_an_arrow/