Si restringimos nuestra comprensión de una categoría a ser el habitual Category
de la clase en Haskell:
class Category c where
id :: c x x
(>>>) :: c x y -> c y z -> c x z
A continuación, vamos a decir que un Arrow
es Category
que además:
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')
Podemos deducir con facilidad:
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
O podemos derivar (***)
de first
y second
:
a1 *** a2 = first a1 >>> second a2
También podemos derivar:
dup :: c x (x,x)
dup = id &&& id
O podemos derivar (&&&)
da dup
y (***)
:
a1 &&& a2 = dup >>> (a1 *** a2)
¿Cuál es mi punto y lo que mi pregunta? Es este:
¿Qué es Arrow
sin arr
? Parece perfectamente coherente y útil. ¿Hay alguna flecha leyes (además de la categoría de leyes) que no implican arr
y permanecen intactos aquí? Y ¿qué significa todo esto en la categoría de teoría?
Básicamente me robaron esta pregunta de reddit, pero generalizada y se explayó sobre ella: http://www.reddit.com/r/haskell/comments/2e0ane/category_with_fanout_and_split_but_not_an_arrow/