
Hello haskell-cafe, I currently have a problem with running par/pseq in the ST monad. The function testST is the minimal counterexample that works -- or, to be more clear, does not work as expected for me. As a remark, the tasks/function calls in my "real application" are much more computational expensive, but the code is too long to post here.
-- File ST.lhs module Main where import Control.Monad.ST import Control.Parallel main = testST
testST :: IO () testST = do putStrLn "Starting" (runST $ f 10) `pseq` putStrLn "Stopping" where f :: forall s. Int -> ST s () f n = do p $ "\nTask:" ++ show n if n < 0 then return () else do (n1,n2) <- return (n-1,n-2) q n1 q n2 a <- f n1 b <- f n2 (a `par` b) `pseq` return a
-- Some helper functions p x = unsafeIOToST (putStrLn x) q x = unsafeIOToST (print x)
As far as I understand, compiling with ghc --make -O2 -threaded ST.lhs -o st -XRankNTypes and running with ./st +RTS -N -s should create sparks that could be run in parallel. The problem I have now, is that sparks are created but not converted, according to -s output: ... a lot of (uninteresting) stuff SPARKS: 232 (0 converted, 0 pruned) ... I have not found any information on this type of behaviour on the net and would be glad if someone could give me points or hints what's happening and how I can improve this. Cheers, Michael -- Dipl.-Inf. Michael C. Lesniak University of Kassel Programming Languages / Methodologies Research Group Department of Computer Science and Electrical Engineering Wilhelmshöher Allee 73 34121 Kassel Phone: +49-(0)561-804-6269