Not only does your suggestion make more sense than what I was doing, but
also
it causes the 'matrices' to behave as expected, namely to have the side
effects
incorporated into their array values.
I can't say I fully understand why this is true. In both cases I was
wrapping Rmatrix in
a monad after every computation. The difference is that the array
component had an
additional monad wrapper around and now it doesn't. That is,
old case
newtype Rmatrix = Rmatrix (Int, Int, IO(StorableArray Int CDouble))
new case
newtype Rmatrix = Rmatrix (Int, Int, StorableArray Int CDouble)
In the old way, the additional IO wrapper forces an additional nesting
of do loops for most processing.
It is certainly the case that the do loop that performs the
withStorableArray operations has the contents
of the array modified. Outside that loop, once all actions on the monad
are done, I am not convinced the
array will mutate unless it's explicitly returned.
Now hopefully I won't induce unnecessary copying. Thanks again for your
help.
Brian Hulley wrote:
Hi Matthew -
Sorry about the long delay in my reply to your last message - I'd
composed the reply but when I tried to send it I was blocked by
spamhaus.com because the dynamic IP that my ISP had allocated to me at
the time I was connected had been listed on some composite spam
blocker database, and even when I tried reconnecting several times I
kept ending up being allocated the same client IP. So I did a complete
scan of my system and now (several hours later) when I tried to
reconnect again, I've been allocated a different client IP so my reply
to your last message was sent at last! ...
I hope it answers your question relating to the above: the array is
not created in the let statement, but twice, in
rout <- mac r2 (-0.5) rmat
and then again in
mprint r2
Rmatrix really needs to have type (Int, Int, StorableArray Int
CDouble) if your intention is to pass around an actual allocated
matrix together with its dimensions, and listtoRmatrix would need to
be typed as:
listtoRmatrix :: Int -> Int -> IO Rmatrix
so that the let statement could be replaced by
r2 <- listtoRmatrix 3 2 [1, 1, 1, 1, 1, 1]
and for example mprint would be defined as:
mprint :: Rmatrix -> IO ()
mprint (Rmatrix cols rows arr) = do
-- just print element at (0,0) for the moment
readArray arr 0 >>= print
(Of course the above needs to iterate through the rows cols etc but
you've already got the code to do this...)
Hope this helps,
Brian.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe