There are a few things wrong with this... > uni :: IO () -> Float > uni = do > xs <- newStdGen > let > m = (head (randoms xs) :: Float )
presumably, you want 'uni' to produce a random float. in this case, it has the wrong type; it is actually an IO action that returns a Float, hence it's type should be: uni :: IO Float furthermore, IO actions (and functions in general) need to return something; since you're using 'do' notation, you need to have a call to return, something like: uni = do xs <- newStdGen let m = (head (randoms xs) :: Float) return m -- return the head or more simply uni = do xs <- newStdGen return (head (randoms xs)) then, since do { x <- f ; y x } really means "f >>= \x -> y x" which is "f >>= y", you could write this as uni = newStdGen >>= return . head . randoms (if that doesn't make sense, don't worry) > doubleit :: Float -> Float > doubleit n = 2.0*n this is fine > main = print (doubleit uni) here's another problem. the type of uni is IO Float. the type of doubleit is Float -> Float. You can't pass an IO Float as a parameter instead of a float. what you need to do is perform the action uni, get the result, pass it to doubleit and then print that, something like: main = do v <- uni print (doubleit v) again, you can rewrite this: main = uni >> print . doubleit hope that made some sense, i gotta run - hal _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell