
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:Bulat.Ziganshin@gmail.com