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 list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners