Стрелка без обр.

Если мы ограничим наше понимание категории обычным классом Category в Haskell:

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)

Какова моя точка зрения и каков мой вопрос? Это:

Что такое Arrow без arr? Это кажется совершенно последовательным и полезным. Существуют ли какие-либо законы стрелок (помимо только законов категорий), которые не затрагивают arr и остаются здесь нетронутыми? И что все это означает в теории категорий?


По сути, я украл этот вопрос с Reddit, но обобщил и разъяснил его: http://www.reddit.com/r/haskell/comments/2e0ane/category_with_fanout_and_split_but_not_an_arrow/


person Dan Burton    schedule 19.08.2014    source источник
comment
У меня есть этот класс в моем проекте с ограниченными категориями., несколько глупо названный Morphism. Некоторые законы продолжают иметь смысл, даже если вокруг нет функций... такие вещи, как fst или const, являются методами других классов в этом пакете, и их необходимо использовать для правильной формулировки законов. Я бы удивился, если бы Эдвард, Конал или кто-то еще не сделал это где-то, но под каким именем я не знаю...   -  person leftaroundabout    schedule 20.08.2014
comment
Вы можете прочитать об обобщенных стрелках.   -  person Luis Casillas    schedule 20.08.2014


Ответы (1)


Точно так же, как Arrow — это категория с продуктом, Arrow без arr также является категорией с продуктом (таким образом, законы категорий всегда выполняются).

arr — это функтор из категории Hask в категорию c. Код, показанный ниже, указывает на это. arr предоставляет способ поднять нормальные функции (которые являются морфизмами в Hask) в инстанцированную категорию c. Это чем-то похоже на fmap (эндофунктор от хаска к хаску), но более обобщенно. В связи с этим некоторые законы о стрелках здесь опишите законы функтора (хотя есть и законы для произведения).

Таким образом, опуская 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
person 谷口昂平    schedule 23.09.2014