Judah Jacobson wrote:
On Jan 30, 2008 8:31 AM, Bryan O'Sullivan <[EMAIL PROTECTED]> wrote:
Peter Verswyvelen wrote:

Then I tried the "seq" hack to force the handle opened by readFile to be 
closed, but that did not seem to work either. For example, the following still gave 
access denied:

main = do
  cs <- readFile "L:/Foo.txt"
  writeFile "L:/Foo.txt" $ seq (length cs) cs
This is unfortunately a classic beginner's mistake.  You got the seq
wrong here, which is very common.
[...]
You need to float the call to seq out so that it's evaluated before the
call to writeFile:

  length cs `seq` writeFile cs


Another way of doing things: I've recently become a fan of
Control.Exception.evaluate:

main = do
  cs <- readFile "L:/Foo.txt"
  evalute (length cs)
  writeFile "L:/Foo.txt" cs

This might be easier for beginners to understand than messing around
with seq's (as long as you're already in the IO monad).


And even better is

main = do
  cs <- strictReadFile "L:/Foo.txt"
  writeFile "L:/Foo.txt" cs

which can be rewritten as

main = writeFile "L:/Foo.txt" =<< strictReadFile "L:/Foo.txt"

if you like such things.

The problem is that strictReadFile isn't in the standard lib. My opinion is that readFile should *be* strict, and the lazy version should be an option with caveats.

In bos's notation, I'd say that readFile should be strict, and on level 1. It does what people expect. Sure it runs out of memory if the file is very big, but I don't find that unexpected. lazyReadFile can go on level 2 after the boss.

Jules
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to