title: Would a type class "between" Category and Arrow make sense?
body: <p>Often you have something like an <code>Applicative</code> without <code>pure</code>, or something like a <code>Monad</code>, but without <code>return</code>. The <a href="http://hackage.haskell.org/package/semigroupoids" rel="noreferrer">semigroupoid</a> package covers these cases with <code>Apply</code> and <code>Bind</code>. Now I'm in a similar situation concerning <code>Arrow</code>, where I can't define a meaningful <code>arr</code> function, but I think the other functions would make perfect sense. </p>
  
  <p>I defined a type that holds a function and it's reverse function:</p>
  
  <pre><code>import Control.Category
  
  data Rev a b = Rev (a -&gt; b) (b -&gt; a)
  
  reverse (Rev f g) = Rev g f
  apply (Rev f _) x = f x
  applyReverse (Rev _ g) y = g y
  compose (Rev f f') (Rev g g') = Rev ((Prelude..) f g) ((Prelude..) g' f') 
  
  instance Category Rev where
    id = Rev Prelude.id Prelude.id
    (.) x y = compose x y 
  </code></pre>
  
  <p>Now I can't implement <code>Arrow</code>, but something weaker:</p>
  
  <pre><code>--"Ow" is an "Arrow" without "arr"
  class Category a =&gt; Ow a where
    first :: a b c -&gt; a (b,d) (c,d)
    first f = stars f Control.Category.id
  
    second :: a b c -&gt; a (d,b) (d,c)
    second f = stars Control.Category.id f
  
    --same as (***)
    stars :: a b c -&gt; a b' c' -&gt; a (b,b') (c,c')
  
   ...
   import Control.Arrow 
  
   instance Ow Rev where
      stars (Rev f f') (Rev g g') = Rev (f *** g) (f' *** g')  
  </code></pre>
  
  <p>I think I can't implement the equivalent of <code>&amp;&amp;&amp;</code>, as it is defined as <code>f &amp;&amp;&amp; g = arr (\b -&gt; (b,b)) &gt;&gt;&gt; f *** g</code>, and <code>(\b -&gt; (b,b))</code> isn't reversable. Still, do you think this weaker type class could be useful? Does it even make sense from a theoretical point of view? </p>