
Ok, now the analysis. Without the $, you get this error message (ghci
7.8.3):
Couldn't match type ‘g0 -> (a0, g0)’ with ‘(a, (a0, a0))’
Expected type: (a0, a0) -> (a, (a0, a0))
Actual type: (a0, a0) -> g0 -> (a0, g0)
Relevant bindings include
genThree :: t -> a (bound at /tmp/test.hs:6:1)
Probable cause: ‘randomR’ is applied to too few arguments
In the first argument of ‘state’, namely ‘randomR’
In a stmt of a 'do' block: state randomR (listMin, listMax)
The key line is "Probable cause: 'randomR' is applied to too few
arguments". Since it takes and apparently has one argument, the most likely
cause is that the expression isn't parsed the way you expect.. So make the
parse explicit, which would be "state (randomR (listMin, listMax))". Using
the $ operator does the same thing, and reads a bit cleaner once you get
used to it.
On Fri, Apr 17, 2015 at 6:19 PM, Thomas Jakway
Thank you very much!
On 4/17/15 6:48 PM, Mike Meyer wrote:
On Fri, Apr 17, 2015 at 2:25 PM, Thomas Jakway
wrote: genThree listMax = do --highest index in the list let listMin = 0 :: Int --lowest index in the list generatedMin <- state randomR (listMin, listMax) return generatedMin
What you're missing is a $:
The only chagne to our genThree functions is making it "state $" instead of "state".
#!/usr/bin/env runhaskell
import System.Random import Control.Monad.State
genThree listMax = do --highest index in the list let listMin = 0 :: Int --lowest index in the list generatedMin <- state $ randomR (listMin, listMax) return generatedMin
main = do gen <- newStdGen print $ evalState (genThree 10) gen
_______________________________________________ Beginners mailing listBeginners@haskell.orghttp://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners