【问题标题】:Arrow without arr没有 arr 的箭头
【发布时间】:2014-08-19 23:50:15
【问题描述】:

如果我们将我们对类别的理解限制为 Haskell 中常见的 Category 类:

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

那么假设ArrowCategory,它还可以:

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

或者我们可以从firstsecond推导出(***)

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

我们也可以推导出来:

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

或者我们可以在给定dup(***)的情况下推导出(&&&)

a1 &&& a2 = dup >>> (a1 *** a2)

我的观点和问题是什么?是这样的:

没有arrArrow 是什么?它似乎完全连贯且有用。是否有任何不涉及arr 并在此处保持不变的箭头法(除了类别法)?这在范畴论中意味着什么?


我基本上是从 reddit 上偷来的这个问题,但对其进行了概括和阐述: http://www.reddit.com/r/haskell/comments/2e0ane/category_with_fanout_and_split_but_not_an_arrow/

【问题讨论】:

  • 我在my constrained-categories project 有这门课,有点愚蠢地叫Morphism。一些法律仍然有意义,即使周围没有任何功能......像fstconst这样的东西是该包中其他类的方法,需要用于正确制定法律。如果 Edward、Conal 或其他人还没有在某个地方做过那件事,我会感到惊讶,但我不知道叫什么名字......
  • 您可能想了解Generalized Arrows

标签: haskell arrows category-theory


【解决方案1】:

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

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

因此,通过省略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

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2016-07-08
    • 2023-04-06
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多