Если мы ограничим наше понимание категории обычным классом 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/
Morphism
. Некоторые законы продолжают иметь смысл, даже если вокруг нет функций... такие вещи, какfst
илиconst
, являются методами других классов в этом пакете, и их необходимо использовать для правильной формулировки законов. Я бы удивился, если бы Эдвард, Конал или кто-то еще не сделал это где-то, но под каким именем я не знаю... - person leftaroundabout   schedule 20.08.2014