I had similar experiences as you when attempting to write "high performance Haskell"; the language makes you want to use high-level abstracted functions but the optimizer (while amazing, to be honest) seems to miss a few cases that it seems like it should hit.
The problem seems to be that the compiler is extremely good at optimizing systems-level code, but that any "control-structure" function needs to be extremely inlined to be successful. You might try re-writing "sequence" or "foldM" a few different ways using the same "test" function and see what you can get. One thing that I notice about this code is that if you switch Right and Left you will get the default behavior for the Either monad: worldSceneSwitch point = case redSphere (0,50,0) 50 point of v@(Left _) -> v Right d1 -> case greenSphere (25,-250,0) 50 point of v@(Left _) -> v Right d2 -> Right $ d1 `min` d2 is the same as worldSceneSwitch point = do d1 <- redSphere (0, 50, 0) 50 point d2 <- greenSphere (25, -250, 0) 50 point Right (d1 `min` d2) Here is the same concept using foldM: minimumM (x : xs) = do v0 <- x foldM (return . min) v0 xs worldSceneSwitch point = minimumM [ redSphere (0, 50, 0) 50 point, greenSphere (25, -250, 0) 50 point ] However, the performance here will be terrible if minimumM and foldM do not get sufficiently inlined; you do not want to be allocating list thunks just to execute them shortly thereafter. -- ryan On Sat, Jul 19, 2008 at 6:48 AM, Mitar <[EMAIL PROTECTED]> wrote: > Hi! > > I had to change code somewhat. Now I have a function like: > > worldScene point = case redSphere (0,50,0) 50 point of > v@(Right _) -> v > Left d1 -> case greenSphere (25,-250,0) 50 point of > v@(Right _) -> v > Left d2 -> Left $ d1 `min` d2 > > (Of course there could be more objects.) > > Any suggestion how could I make this less hard-coded? Something which > would take a list of objects (object functions) and then return a > Right if any object function return Right or a minimum value of all > Lefts. But that it would have similar performance? If not on my GHC > version (6.8.3) on something newer (which uses fusion or something). > Is there some standard function for this or should I write my own > recursive function to run over a list of object functions? But I am > afraid that this will be hard to optimize for compiler. > > (It is important to notice that the order of executing object > functions is not important so it could be a good candidate for > parallelism.) > > > Mitar > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe