Hello Michael,

Friday, July 13, 2007, 8:22:09 AM, you wrote:

>         cs <- return $! lines c
>         hClose h
>         putStrLn $ show $ length cs

> This works.  However, I don't understand why this version works and the 
> previous version doesn't.
> Can anyone walk me through the evaluation?  Also, is there a way to make 
> "let" strict?

first, it may be written also as

>         return $! lines c
>         hClose h
>         let cs = lines c
>         putStrLn $ show $ length cs

the key is that return is *action* and should be executed before doing
next action, hClose. '$!' means that argument should evaluated before
calling 'return', so 'return $!' is a sort of idiom that force
immediate evaluation of its argument (but be cautious! for list it
evaluates only its first element and you program actually always
prints 1 for non-empty file! the right solution will be to force
evaluation of whole list by calculating its 'length' or 'last', for
example)

as usual, i suggest you to read http://haskell.org/haskellwiki/IO_inside


-- 
Best regards,
 Bulat                            mailto:[EMAIL PROTECTED]

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to