Cale Gibbard wrote:
Indeed, I agree.

While we're at it, I'd like to see the Arrow class a bit more thinly sliced. Something like this:

  class Compositor a where
    identity :: a b b
    (>>>) :: a b c -> a c d -> a b d

  class Compositor a => Arrow a where
    pure :: (b -> c) -> a b c

  class Arrow a => ArrowProduct a where
    (&&&) :: a b c -> a b c' -> a b (c, c')
    -- derived:
    first :: a b c -> a (b, d) (c, d)
    second :: a b c -> a (d, b) (d, c)
    (***) :: a b c -> a b' c' -> a (b, b') (c, c')

  class Arrow a => ArrowCoproduct a where
    (|||) :: a b d -> a c d -> a (Either b c) d
    -- derived:
    left :: a b c -> a (Either b d) (Either c d)
    right :: a b c -> a (Either d b) (Either d c)
    (+++) :: a b c -> a b' c' -> a (Either b b') (Either c c')

  class (ArrowProduct a,ArrowCoproduct a) => ArrowFull a

  etc.

--
Ashley Yakeley
Seattle WA

_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-prime

Reply via email to