2009/1/6 Luke Palmer <lrpal...@gmail.com>: > 2009/1/6 Wang, Chunye (NSN - CN/Beijing) <chunye.w...@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
You can also reuse the name exactly by using bind+return instead of let: test filename = do is_dir <- doesDirectoryExist filename filename <- return $ if not is_dir then filename else filename I'm not a huge fan of the prime thing because it's tiny and easy to miss and if you forget it you probably won't get a type error, you'll just get a bug, possibly a subtle one. Besides, what's the next step? filename''? filename'''? _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe