[Haskell-beginners] seq vs deepseq

Ryan Warner ryan.warner.mn+haskell at gmail.com
Wed Jul 22 02:29:57 UTC 2015


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?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20150721/2bf7f6f8/attachment.html>


More information about the Beginners mailing list