25

如果我们将我们对类别的理解限制为CategoryHaskell 中的普通类:

class Category c where
  id :: c x x
  (>>>) :: c x y -> c y z -> c x z

然后假设 anArrow是一个Categorywhich 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

或者我们可以(***)firstand派生second

a1 *** a2 = first a1 >>> second a2

我们还可以得出:

dup :: c x (x,x)
dup = id &&& id

或者我们可以推导出(&&&)给定的dupand (***)

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/

4

1 回答 1

2

就像Arrow有产品的类别一样,Arrow没有产品arr也是有产品的类别(因此类别法则始终成立)。

arr是从 Hask 类别到c类别的函子。下面显示的代码表明了这一点。arr提供了一种将普通函数(Hask 中的态射)提升到实例化c类别的方法。这有点像fmap(从 Hask 到 Hask 的 endofunctor),但更通用。与此相关,这里的一些箭头定律描述了函子定律(尽管也有乘积定律)。

因此,通过省略arr,您将失去提升正常功能的功能,或者从另一个角度来看,您将无法实现它。但是,所有其他特征都是相同的。

{-# LANGUAGE TypeOperators, RankNTypes #-}

-- | Functor arrow
type (:->) c d = forall a b. c a b -> d a b

-- | Hask category; types are objects, functions are morphisms.
type Hask = (->)

arr :: Arrow c => Hask :-> c
arr = Control.Arrow.arr
于 2014-09-23T08:18:33.693 回答