Question about implementation of an "information-passnig" arrow

Yu Di diyu60607 at yahoo.com
Mon Sep 15 15:15:00 EDT 2003


Sorry I just now pressed "send" by mistake when the
letter was not finished yet. Please ignore my last
mail. Thanks. Following is the correct version of my
question.

-----

Hi, I want to create an arrow which is essentially

data MyArrow a b = MyArrow ((String, a) -> (String,
b))

i.e. there is an "information" asscioated with each
piece of data (represented by the string), and I want
to pass it around. And often the arrow's processing
logic will depend on the input information, therefore
a monad-style 

data MyArrow a b = MyArrow (a -> (String, b)) 

will not work.

Now I have a problem with the definition of "pure" and
"first". At first, I declared

pure f = MyArrow (\(s, x) -> (s, f x))
first (MyArrow f) = MyArrow (\(s, (x, y)) -> let (s',
z) = f (s, x) in (s', (z, y)))

this seems to work, but then I begin to have problems
with the "data-plumbing" pure arrows, e.g. in

pure (\x -> (x, x)) >>> first someArrow >>>> pure
(\(_, x) -> x)

Ideally, this arrow will preserve whatever information
I put there for the input, but because "first
someArrow" will change the WHOLE information
associated with the pair of result, I can't find any
way to let "pure (\(_, x)->x)" (which is an extremely
generic function) retrieve the PART of information for
the second piece in the pair tuple.

I thought about this a lot, but it seems to me that
the only way to solve this is to somehow make the
information "lookupable" from the data itself, not
"placed beside" the data, but how I can do that? And
can there be some other solution to this?

Thanks very much!

Di, Yu
9.15

__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com


More information about the Haskell mailing list