MB> I think there are some problems with your implementation of
MB> "first". Here are some examples which don't behave the way I would
MB> expect:

You are right. I have a problem and I need to think of it a bit more.

MB> My first attempt was to use explicit queues:

So was mine. But then I thought I can replace queues by function
composition; seems that I took a wrong step somewhere.

*Main>> runSP (Put 42 returnA) []
MB> [42]
*Main>> runSP (first (Put 42 returnA)) []
MB> []

MB> In the second case, I think the answer should really be [(42,_|_)].

I think, your implementation handles this correctly. Stream processors
are supposed to handle infinite lists, not finite ones; so, if we
continue feeding (first (Put 42 returnA)) with data, it would be able
to output (42,something) instead of (42,(_|_)).

MB> Same goes for mapA given in the tutorial [2]. This problem also
MB> prevented me from defining an instance of ArrowLoop.

Seems to be the same problem I have. It was stated at the end of my
posting.

MB> So, I don't think explicit queues are the answer. I suspect one
MB> needs to use the circular/lazy programming technique described in
MB> section 2.3 [2] to implement the basic Arrow combinators, as well
MB> as ArrowLoop. With some luck, that might solve both of the above
MB> problems.

Tried that, but failed. Seems that this technique works only for very
lazy stream processors - such as SF - and SP are more strict.

There is a presentation "Arrows for Fudgets" by Magnus Carlsson, which
explains that stream processors (SP) are not Hughes' arrows, but more
general ones, with (,) bifunctor replaced with Either.

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

Reply via email to