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 <tjakway@nyu.edu> wrote:
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 <tjakway@nyu.edu> 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