
I'm trying to grok Haskell's laziness. In this example, why does the seq not force youTyped to wait for s to be fully evaluated, before returning a result to putStrLn? -------------------- import System.IO (hSetBuffering,stdin,BufferMode(..)) youTyped :: String -> String youTyped s = s `seq` "you typed: " ++ s main = do hSetBuffering stdin NoBuffering s <- getContents let l = map youTyped $ lines $ takeWhile ( /= '\04' ) s mapM_ putStrLn ("Start Typing (Ctrl-D to exit):":l) -------------------- The output looks like: -------------------- $ runhaskell seqLazy.hs Start Typing (Ctrl-D to exit): Hyou typed: Heelllloo wwoorrlldd fyou typed: faaiill ^D -------------------- Changing seq, to deepseq does the trick though. -------------------- import System.IO (hSetBuffering,stdin,BufferMode(..)) import Control.DeepSeq youTyped :: String -> String youTyped s = s `deepseq` "you typed: " ++ s main = do hSetBuffering stdin NoBuffering s <- getContents let l = map youTyped $ lines $ takeWhile ( /= '\04' ) s mapM_ putStrLn ("Start Typing (Ctrl-D to exit):":l) -------------------- Output: $ runhaskell deepSeqLazy.hs Start Typing (Ctrl-D to exit): Hello world you typed: Hello world success you typed: success ^D When does it make sense to use seq then?