
I am trying to use randomRs at the ghci prompt like so Prelude System.Random> take 10 $ (randomRs (1, 6) newStdGen) but I get the following error <interactive>:16:12: Could not deduce (RandomGen (IO StdGen)) arising from a use of `randomRs' from the context (Random a, Num a) bound by the inferred type of it :: (Random a, Num a) => [a] at <interactive>:16:1-37 In the second argument of `($)', namely `(randomRs (1, 6) newStdGen)' In the expression: take 10 $ (randomRs (1, 6) newStdGen) In an equation for `it': it = take 10 $ (randomRs (1, 6) newStdGen) I have tried a variety of options, like wrapping it in a "do" or adding type annotations. Nothing seems to work. -----Original Message----- From: Beginners [mailto:beginners-bounces@haskell.org] On Behalf Of martin Sent: Friday, September 12, 2014 10:05 AM To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell Subject: Re: [Haskell-beginners] How to add a "method" to a record Am 09/10/2014 08:50 PM, schrieb Corentin Dupont:
If the field "label" can be deduced from "payload", I recommend not to include it in your structure, because that would be redundant.
Here how you could write it:
data Foo pl = Foo { payload :: pl}
labelInt :: Foo Int -> String labelInt (Foo a) = "Int payload:" ++ (show a)
labelString :: Foo String -> String labelString (Foo a) = "String payload" ++ a
You are obliged to define two separate label function, because "Foo Int" and "Foo String" are two completly separate types.
This is exactly my problem: Someone will use this type an define the type of pl. How can I know what type she'll use? What I'd like to express is that whoever creates a concrete type should also provide the proper label function.
On Wed, Sep 10, 2014 at 2:06 PM, martin
wrote: Hello all
if I have a record like
data Foo pl = Foo { label :: String, payload :: pl }
how can I create a similar type where I can populate label so it is not a plain string, but a function which operates on payload? Something like
label (Foo pl) = show pl
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

On Mon, Sep 15, 2014 at 10:01 PM, Jeff C. Britton
Prelude System.Random> take 10 $ (randomRs (1, 6) newStdGen)
I think you need to read http://www.vex.net/~trebla/haskell/IO.xhtml. You're trying to operate directly on an IO "program" (newStdGen) as if it were a value. -- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net

The simple answer is with do notation:
main = do
g <- newStdGen
print $ randomRs (1,2) g
Or without do notation, something like:
newStdGen >>= print . take 10 . randomRs (1,2)
On Mon, Sep 15, 2014 at 10:01 PM, Jeff C. Britton
I am trying to use randomRs at the ghci prompt like so
Prelude System.Random> take 10 $ (randomRs (1, 6) newStdGen)
but I get the following error <interactive>:16:12: Could not deduce (RandomGen (IO StdGen)) arising from a use of `randomRs' from the context (Random a, Num a) bound by the inferred type of it :: (Random a, Num a) => [a] at <interactive>:16:1-37 In the second argument of `($)', namely `(randomRs (1, 6) newStdGen)' In the expression: take 10 $ (randomRs (1, 6) newStdGen) In an equation for `it': it = take 10 $ (randomRs (1, 6) newStdGen)
I have tried a variety of options, like wrapping it in a "do" or adding type annotations. Nothing seems to work.
-----Original Message----- From: Beginners [mailto:beginners-bounces@haskell.org] On Behalf Of martin Sent: Friday, September 12, 2014 10:05 AM To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell Subject: Re: [Haskell-beginners] How to add a "method" to a record
Am 09/10/2014 08:50 PM, schrieb Corentin Dupont:
If the field "label" can be deduced from "payload", I recommend not to include it in your structure, because that would be redundant.
Here how you could write it:
data Foo pl = Foo { payload :: pl}
labelInt :: Foo Int -> String labelInt (Foo a) = "Int payload:" ++ (show a)
labelString :: Foo String -> String labelString (Foo a) = "String payload" ++ a
You are obliged to define two separate label function, because "Foo Int" and "Foo String" are two completly separate types.
This is exactly my problem: Someone will use this type an define the type of pl. How can I know what type she'll use? What I'd like to express is that whoever creates a concrete type should also provide the proper label function.
On Wed, Sep 10, 2014 at 2:06 PM, martin <
martin.drautzburg@web.de> wrote:
Hello all
if I have a record like
data Foo pl = Foo { label :: String, payload :: pl }
how can I create a similar type where I can populate label
so it is not a plain string, but a function which
operates on payload? Something like
label (Foo pl) = show pl
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

Ok, I got it now. I was misunderstanding how the REPL was interacting with the IO Monad.
I had once tried
do { g <- newStdGen; take 10 $ randomRs (1,6) g }
but I actually needed this
do { g <- newStdGen; return . take 10 $ randomRs (1,6) g }
Thanks,
Jeff
From: Beginners [mailto:beginners-bounces@haskell.org] On Behalf Of David McBride
Sent: Monday, September 15, 2014 7:27 PM
To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell
Subject: Re: [Haskell-beginners] ghci and randomRs
The simple answer is with do notation:
main = do
g <- newStdGen
print $ randomRs (1,2) g
Or without do notation, something like:
newStdGen >>= print . take 10 . randomRs (1,2)
On Mon, Sep 15, 2014 at 10:01 PM, Jeff C. Britton
If the field "label" can be deduced from "payload", I recommend not to include it in your structure, because that would be redundant.
Here how you could write it:
data Foo pl = Foo { payload :: pl}
labelInt :: Foo Int -> String labelInt (Foo a) = "Int payload:" ++ (show a)
labelString :: Foo String -> String labelString (Foo a) = "String payload" ++ a
You are obliged to define two separate label function, because "Foo Int" and "Foo String" are two completly separate types.
This is exactly my problem: Someone will use this type an define the type of pl. How can I know what type she'll use? What I'd like to express is that whoever creates a concrete type should also provide the proper label function.
On Wed, Sep 10, 2014 at 2:06 PM, martin
mailto:martin.drautzburg@web.de> wrote: Hello all
if I have a record like
data Foo pl = Foo { label :: String, payload :: pl }
how can I create a similar type where I can populate label so it is not a plain string, but a function which operates on payload? Something like
label (Foo pl) = show pl
_______________________________________________ Beginners mailing list Beginners@haskell.orgmailto:Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners _______________________________________________ Beginners mailing list Beginners@haskell.orgmailto:Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

On Tue, Sep 16, 2014 at 05:43:04PM +0000, Jeff C. Britton wrote:
Ok, I got it now. I was misunderstanding how the REPL was interacting with the IO Monad. I had once tried do { g <- newStdGen; take 10 $ randomRs (1,6) g }
but I actually needed this do { g <- newStdGen; return . take 10 $ randomRs (1,6) g }
Thanks, Jeff
I am sure you have already figured it out, but in case you didn't, this works too: λ> :m +System.Random λ> g <- newStdGen λ> take 10 $ randomRs (1,6) g [3,3,5,1,6,6,3,3,1,6] λ> (and keeps IO actions apart from pure code)

Thanks Francesco. This actually helped me. --Jeff -----Original Message----- From: Beginners [mailto:beginners-bounces@haskell.org] On Behalf Of Francesco Ariis Sent: Tuesday, September 16, 2014 12:06 PM To: beginners@haskell.org Subject: Re: [Haskell-beginners] ghci and randomRs On Tue, Sep 16, 2014 at 05:43:04PM +0000, Jeff C. Britton wrote:
Ok, I got it now. I was misunderstanding how the REPL was interacting with the IO Monad. I had once tried do { g <- newStdGen; take 10 $ randomRs (1,6) g }
but I actually needed this do { g <- newStdGen; return . take 10 $ randomRs (1,6) g }
Thanks, Jeff
I am sure you have already figured it out, but in case you didn't, this works too: λ> :m +System.Random λ> g <- newStdGen λ> take 10 $ randomRs (1,6) g [3,3,5,1,6,6,3,3,1,6] λ> (and keeps IO actions apart from pure code) _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
participants (4)
-
Brandon Allbery
-
David McBride
-
Francesco Ariis
-
Jeff C. Britton