On Friday, 27 November 2015 at 12:16:34 UTC, Jonathan M Davis wrote:
Well, if you're dealing with a pseudo-random generator with a specific seed, I'm not sure that it's okay, though obviously for a fully random number generator, it wouldn't matter.

I think the distinction here is artificial. If `range` is a random number generator, then `take` has no right to expect its output to be deterministic or consistent in any way.

When we come to input ranges in general, that's surely a factor we need to take into account. Can the InputRange actually be relied on as a deterministic iteration, but one where we can't save our state? Or should it be treated as simply a source of data, about which one can make no assumptions regarding its consistency?

I think answering that question -- and maybe distinguishing the two cases if possible -- feeds into how to address the subsequent problems you describe.

Possibly, but because almost everything in Haskell is both functional and lazy, you don't really get the problem of popFront being called after the call to take.

I'm not sure that's really true. I'm reasonably sure that I can (given some source of IO) do something like (pseudo-code because my Haskell is rusty),

    do
lazyData = something_that_lazily_reads_5_entries_from_the_IO_entity
        read_some_data_from_IO
        read_some_data_from_IO
        do_something_with_lazyData

If the source of IO is the standard random number generator of Haskell, for example, it'll behave like the input range/popFront example.

Reply via email to