Oh, you're right.  Here are some thoughts.

You want the list you get back to only contain values in WHNF.  This differs from mergeIO & co., which are simply evaluating the spine of the list, and don't even look at the values. 

I would also consider it bad style to be fully polymorphic in this case, as you require polymorphic seq, which is evil (though I don't have the space to argue this right now :-).  Unamb would be bad style, also, since your semantics are nondeterministic and so you wouldn't meet the precondition.  Surely your result would have to be in IO.  ("amb" would be okay)

Here is how I would do it:

chooseIO :: [IO a] -> IO [a]
chooseIO xs = do
    chan <- newChan
    let eval io = forkIO (io >>= writeChan chan)
    forkIO $ mapM_ eval xs
    getChanContents chan

(The list never ends in this case, even when xs is finite.  I think it's possible to make the result finite with the argument is, and maintain good GC properties, but it would take some care)

The reason I take a list of [IO a] is to avoid polymorphic seq; the elements of the list have built in what it means to evaluate them.  This also buys you more flexibility (but also fewer guarantees...).

For the working Haskeller, it is safe to avoid all this pedantic zealotry... I'm just being a purist.

Luke



On Tue, Mar 10, 2009 at 5:31 PM, Anatoly Yakovenko <aeyakovenko@gmail.com> wrote:
i think this would still force me to evailuate the whole list, right?
i would want something that pipes the results into a channel that i
can lazyly read as the results are available.

On Tue, Mar 10, 2009 at 2:44 PM, Luke Palmer <lrpalmer@gmail.com> wrote:
> I think nmergeIO . map (:[]) should do the trick.
>
> Luke
>
> On Tue, Mar 10, 2009 at 3:41 PM, Anatoly Yakovenko <aeyakovenko@gmail.com>
> wrote:
>>
>> Hmm, yea, actually that makes sense.  What i am looking for is
>> something that maps over a list and returns the list in order which
>> the values are evaluated.  looks like i can implement that pretty
>> easily with unamb.
>>
>> On Tue, Mar 10, 2009 at 2:33 PM, Luke Palmer <lrpalmer@gmail.com> wrote:
>> > Although it is not formally specified, my intuition for the
>> > specification is
>> > that order is preserved within each of the lists.
>> >
>> > Luke
>> >
>> > On Tue, Mar 10, 2009 at 2:50 PM, Anatoly Yakovenko
>> > <aeyakovenko@gmail.com>
>> > wrote:
>> >>
>> >> do nmergeIO or mergeIO preserve order? or not preserve order?
>> >> _______________________________________________
>> >> Haskell-Cafe mailing list
>> >> Haskell-Cafe@haskell.org
>> >> http://www.haskell.org/mailman/listinfo/haskell-cafe
>> >
>> >
>
>