[Haskell-cafe] generating random lists until some predicate holds

Luke Palmer lrpalmer at gmail.com
Sun Dec 28 17:12:15 EST 2008


On Sun, Dec 28, 2008 at 2:39 PM, Nicholas O. Andrews <nandrews at vt.edu>wrote:

> Hi all,
>
> What's the best way to implement the following Python code in Haskell?
> It is purposefully written in a functional style (and as a result will
> kill your recursion stack every other run).


Here's my solution, using MonadRandom (from Hackage).  There may be more
infinite-listy ways of doing it, but I wasn't able to make it come out
clean.

import Control.Monad.Random

many n = sequence . replicate n

untilM p m = do
  x <- m
  if p x then return x else untilM p m

getList :: MonadRandom m => m [Int]
getList = many 10 $ getRandomR (0,9)

main = print =<< evalRandIO (untilM (all even) getList)


# begin Python
> from random import *
>
> def genList ():
>    return [randint(0,9) for x in range(10)]
>
> def randWhile (predicate):
>    result = genList ()
>    if predicate(result):
>        return result
>    else:
>        return randWhile (predicate)
>
> def allEven (list):
>    return reduce(lambda x,y: x and y, [x%2 == 0 for x in list])
>
> print randWhile (allEven)
> # End Python
>
> Thanks!
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20081228/b0c1c52e/attachment.htm


More information about the Haskell-Cafe mailing list