[Haskell-cafe] Re: How do I do conditional tail recursion in a monad?

apfelmus apfelmus at quantentunnel.de
Wed Mar 21 10:09:29 EDT 2007


DavidA wrote:
> I would like to write a function untilM, which would be to until as mapM is to 
> map.
> 
> An example use would be if I had a function
> dice :: State Int Int
> which returns random dice throws within a state monad.
> 
> Then I'd like to be able to do something like
> untilM (\(s,p)-> s>=100) f (0,1)
>     where f (s,p) = do d <- dice
>                        return (s+d, p*d)
> This should throw dice until the sum exceeds 100, and keeping track of the 
> product as we go along.

How about going with an infinite list of random numbers with no monads
involved

    head
  . dropUntil ((>= 100) . fst)
  . scanl' (\(s,p) d -> (d+s,p*d)) (0,1)
  . randomRs (1,6)

Of course, this has the drawback that you cannot take further random
numbers afterwards.

Regards,
apfelmus



More information about the Haskell-Cafe mailing list