
Hello Gunnar, Thursday, April 20, 2006, 7:34:33 PM, you wrote:
Thanks a lot, it works now. I believed that writeSTRef would always evaluate its arguments because ST is strict, but apparently I was mistaken :)
strict ST monad means that all operations inside it are performed immediately and not deferred until their side-effect is really required. but when you write something to STRef, this reference just saves closure that will calculate expression. to force evaluation of expression you need also to use '$!' or use unbozed references (that is not yet available, i plan to announce this lib several days later). the fastest way to calculate dot product is: dot :: STUArray s Int Double -> STUArray s Int Double -> ST s Double dot x y = do let (l,r) = bounds x cycle sum i | sum `seq` i>r = return sum cycle sum i = do xi <- readArray x i yi <- readArray y i cycle (sum+xi*yi) (i+1) cycle 0 l -- Best regards, Bulat mailto:Bulat.Ziganshin@gmail.com