2011/1/12 Neil Brown <nc...@kent.ac.uk>

> On 11/01/11 23:19, Tim Baumgartner wrote:
>
>> Hi,
>>
>> I'm having difficulties with this function I wrote:
>>
>> iterateR :: (MonadRandom m) => (a -> m a) -> a -> m [a]
>> iterateR g s = do
>>  s' <- g s
>>  return (s:) `ap` iterateR g s'
>>
>> I'm running the computation with evalRandIO and surprisingly the first
>> call of main in ghci succeeds, but the second does not terminate.
>> Reproducible.
>> Any clues what I'm doing wrong here?
>>
>
> If we unfold ap we get:
>
>
> iterateR g s = do
>  s' <- g s
>  f <- return (s:)
>  x <- iterateR g s'
>  return (f x)
>
> What happens here depends on exactly how the monad is defined, but for many
> monads that will form an infinite loop that prevents a value being returned.
>  In the case of RandT from MonadRandom, it is not possible to execute the
> action after the iterateR call finishes without knowing the final state from
> the call, which requires evaluating the infinite loop of monadic actions.
>  Does that help?
>

Yes, this helps definitely. So if I understand you right, the infinite loop
was not entered immediately because of lazyness? That's funny somehow.

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

Reply via email to