
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 But, of course, I can't mix the IO (U.Vector Float) with a U.Vector Float The compilation result in: Couldn't match expected type `U.Vector Float' with actual type `IO (U.Vector Float)' In the return type of a call of `makerow' So, at some point, I have to lift I believe … is there a simple lifting solution? It initially seemed that Monads were the solution … but liftIO resulted in the same thing … just with Monad (U.Vector Float) … There is just some "simple" Haskellism I'm missing here, but after an ginormous amount of reading and googling, it is still eluding me :( Any thoughts (besides the one page I found that helpfully … basically … said "Go back to Java" ;-) Paul Monday Parallel Scientific, LLC. paul.monday@parsci.com