[Haskell-cafe] Fusion for fun and profi (Was: newbie optimization question)

Isaac Dupree isaacdupree at charter.net
Mon Oct 29 09:50:21 EDT 2007


Don Stewart wrote:
>     default(Int)
> 
>     divisors i   = filter (\j -> i `rem`j == 0)         (enumFromTo 1 (i-1))
>     main = print $ filter (\i -> i == sum (divisors i)) (enumFromTo 1 10000)

...

> So almost identical types to the C program (bar for the return [Int]). 
> 
> Finally, we can manually translate the C code into a confusing set of nested
> loops with interleaved IO,

how lazy is `print` supposed to be?  If it's strict, we need to return / 
accumulate a list (and in this case, that is not very time-consuming 
because there are only four numbers in the list)

from http://haskell.org/onlinereport/standard-prelude.html

print x    =  putStrLn (show x)

show on lists is lazy and doesn't matter that it's not for Ints

putStrLn   :: String -> IO ()
putStrLn s =  do putStr s
                  putStr "\n"

putStr     :: String -> IO ()
putStr s   =  mapM_ putChar s

okay, mapM_ makes it lazy.

putChar    :: Char -> IO ()
putChar    =  primPutChar

(It's easy to get confused with OS buffering effects too...)

so it should ALL be able to fuse, with no intermediate lists, I think 
(not sure about [Char] from show... or whether fusion works with IO 
sequencing...)


Isaac


More information about the Haskell-Cafe mailing list