2009/1/6 Wang, Chunye (NSN - CN/Beijing) <chunye.wang@nsn.com>
Dear haskeller,
 
    Can I destructive rebind a local variable like this
 
import System.Directory
test filename = do
  is_dir <- doesDirectoryExist filename
  let filename = if not is_dir then filename else filename

Nope.  The "filename" on the right side of the = is the same as the "filename" on the left, so you're making an infinite loop, the same way:

   let x = x in x 

is an infinite loop.  However you can make a new name as you are trying, you just can't reference the old one.  e.g.:

   let filename = 42

Here would be just fine.

However, for cases like this, it is useful that single quote is a valid identifier, so you can say:

  let filename' = if not is_dir then filename else filename

(read "filename prime")

Luke