In article <[EMAIL PROTECTED]>,
"Yu Di" <[EMAIL PROTECTED]> wrote:
> Hi, I want to create an arrow which is essentially
>
> data MyArrow a b = MyArrow ((String, a) -> (String,b))
I don't think this type is an arrow. For a "product arrow", i.e. an
instance of Hughes' "Arrow" class with "first" defined, you can define
this:
arrProduct :: arrow p q -> arrow p r -> arrow p (q,r);
arrProduct apq apr =
arr (\p -> (p,p)) >>>
first apr >>>
arr (\(r,p) -> (p,r)) >>>
first apq;
This has a certain intuitive symmetry in its arguments, though for
instance for a Kleisli arrow (a -> m b for some monad m), arrProduct
will essentially execute one before the other. But if you try to define
this directly for MyArrow, you'll find you need to pick one of the two
Strings (losing information) or else combine them somehow. Perhaps this:
arrProduct (MyArrow f1) (MyArrow f2) = MyArrow (\sa -> let
{
(s1,b1) <- f1 sa;
(s2,b2) <- f2 sa;
} in (s1 ++ s2,(b1,b2)));
In general, a type of the form (f a -> f b) is an arrow if f is a
Functor that has one of these:
fApply :: f (a -> b) -> f a -> f b;
fProduct :: f a -> f b -> f (a,b);
I call this class of Functors "FunctorApply", but maybe someone has a
better name. I'm not sure what the attached laws are, but I imagine
they're fairly straightforward.
--
Ashley Yakeley, Seattle WA
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell