Hi! I usually use the function 'sized' for this. The function would look something like this:
myIntGen :: Gen Int myIntGen = sized $ \n -> choose (0,f n) where 'f' is a function that uses the size value to generate an upper value for your random range. I usually use ^2 or sqrt or something like that depending on my needs. Hope it helps! Best regards, Øystein On Mon, Jul 25, 2011 at 6:31 AM, Mark Spezzano <[email protected] > wrote: > Hi Kevin, > > Thanks for the response. The first part works well with minor > modifications. > > Part 2 is still a bit vague to me. I basically want to "clamp" the Integers > generated within the Queue to between 0 and some positive number. At present > they're giving me numbers all over the place (specifically negative number) > > Thanks > > Mark > > > On 25/07/2011, at 4:44 AM, Kevin Quick wrote: > > > On Sun, 24 Jul 2011 07:30:56 -0700, Mark Spezzano < > [email protected]> wrote: > > > >> Hi all, > >> > >> I would appreciate it if someone can point me in the right direction > with the following problem. > >> > >> I'm deliberately implementing a naive Queues packages that uses finite > lists as the underlying representation. I've already read through Hughes' > paper and the article in The Fun of Programming, but I'm still having some > difficulties. Specifically: > >> > >> 1. I have a newtype Queue a = Queue [a] and I want to generate Queues of > random Integers that are also of random size. How do I do this in > QuickCheck? I guess that I need to write a generator and then make my > "Queue a" concrete type an instance of Arbitrary? How? > > > > Mark, > > > > One of the great things about QuickCheck is that it is automatically > compositional. > > What I mean by this is that all you need in your instance is how to form > a "Queue [a]" given "[a]", because there are already QuickCheck instances > for forming lists, and as long as a is pretty standard (Integers is fine) > then there's likely an Arbitrary instance for that as well. > > > > So (from my head, not actually tested in GHC): > > > > import Control.Applicative > > import Test.QuickCheck > > > > instance Arbitrary Queue where > > arbitrary = Queue <$> arbitrary > > > > Then you can use this as: > > > > testProperty "length is something" propQInts > > > > propQInts t = length t == .... > > where types = (t :: Queue Integers) > > > > The where clause is a fancy way of specifying what the type of t should > be without having to express the overall type of propQInts. You could use a > more conventional type specification as well. > > > >> > >> 2. If I wanted to specify/constrain the ranges of random Integers > generated, how would I do this? > > > > Probably something like this: > > > > instance Arbitrary Queue where > > arbitrary = do li <- listOf $ arbitrary > > lr <- liftM $ map rangelimit li > > return $ Queue lr > > where rangelimit n = case (n < LOW, n > HIGH) of > > (True,_) -> LOW > > (_,True) -> HIGH > > _ -> n > > > > > >> > >> 3. If I wanted to specify/constrain the Queue sizes how would I do this? > > > > Similar to #2. Perhaps: > > > > arbitrary = arbitrary >>= (return . Queue . take CNT . listOf) > > > > > > -- > > -KQ > > > > _______________________________________________ > > Haskell-Cafe mailing list > > [email protected] > > http://www.haskell.org/mailman/listinfo/haskell-cafe > > > > > > > _______________________________________________ > Haskell-Cafe mailing list > [email protected] > http://www.haskell.org/mailman/listinfo/haskell-cafe > -- Mvh Øystein Kolsrud
_______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
