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
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to