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

Peter Verswyvelen bugfact at gmail.com
Sun Dec 28 17:34:15 EST 2008


I'll give it shot, but I'm also learning Haskell, so take this with a grain
of salt :)
randWhile :: ([Int]->Bool) -> StdGen -> [Int]
randWhile predicate  = head . filter predicate . blocks 10 . randomRs (0,9)
    where
      blocks n xs = let (y,ys) = splitAt n xs in y : blocks n ys

main = newStdGen >>= print . randWhile (all even)

or if you prefer non point free notation (point full?)

randWhile :: ([Int]->Bool) -> StdGen -> [Int]
randWhile predicate rndGen  = head $ filter predicate $ blocks 10 $ randomRs
(0,9) rndGen
    where
      blocks n xs = let (y,ys) = splitAt n xs in y : blocks n ys

main = do
  rndGen <- newStdGen
  print $ randWhile (all even) rndGen

2008/12/28 Luke Palmer <lrpalmer at gmail.com>

> 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
>>
>
>
> _______________________________________________
> 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/e2066a01/attachment.htm


More information about the Haskell-Cafe mailing list