[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