On 12/19/11 10:20 PM, David Menendez wrote:
On Mon, Dec 19, 2011 at 6:37 PM, wren ng thornton<w...@freegeek.org>  wrote:
On 12/14/11 10:58 PM, Gregory Crosswhite wrote:

Of course, this is not a simple change at all because it would have to
be done in such a way as to respect the ordering of actions --- that
is, we can't have each action executed only when the corresponding
element of the list demanded is forced, or else actions would
undesirably interleave.

Therein lies the issue. To put this in a monadic context, this is the same
reason why we can't just say:

    evalState (repeatM getNext) init

e.g., to generate an infinite list of pseudorandom numbers and then discard
the final seed because we have all the numbers we'll ever need.

Sure you can. Just make sure you're using a non-strict state monad.

Fair enough. I over-simplified the example I had in mind, which cannot be evaded so easily.

Though it's worth pointing out that your solution relies on the specific property I mentioned (later in the same email), namely that it is safe to perform the evaluation of lazy state at any point we desire, because it will not interact with other side-effects[1]. Thus, this happens to be one of the monads which has the property necessary for being able to perform the reordering desired by the OP. However, if we try using your 'repeatM' for other monads it is unlikely to work--- and for the same reasons that 'many' and 'some' are problematic for Maybe and lists.


[1] Barring side-effects which perform introspection on the runtime system (e.g., to determine current memory usage, whether a thunk has been forced or not, etc.).

--
Live well,
~wren

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

Reply via email to