class Category cat where id :: cat a a (>>>) :: cat a b -> cat b c -> cat a c class Category a => Arrow a where arr :: (b -> c) -> a b c first, second, (&&&), (***) class Arrow a => ArrowChoice a where left, right, (|||), (+++)