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?