
On Fri, Dec 9, 2011 at 2:00 PM, Paul Monday
I've hammered through the bulk of my issues as I try to build a matrix that consists of random numbers, but the final hurdle is mixing pure and impure functions. Does "impurity" from something like a random number generator or file I/O have to move it's way all the way through my code?
Here is the specific example. I have a function that makes a row in a matrix, it looks like this: makerow :: Int -> (Float, Float) -> IO (U.Vector Float)
The IO (U.Vector Float) is the result of the random number generation that is an impure call, making this an impure result.
I want to compose this into a list makerows :: Int -> Int -> (Float, Float) -> [U.Vector Float] makerows 0 _ _ = [] makerows r n range = makerow n range : makerows r' n range where r' = r - 1
The lifting operator you're looking for is the 'return' function. A direct fix for your code given above would be: makerows 0 _ _ = return [] makerows r n range = do x <- makerow n range xs <- makerows r' n range return (x:xs) If you understand why that works, you now understand Haskell IO. Congratulations! Even better, though, is: makerows r n range = replicateM r (makerow n range) See: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Mon... Antoine