Comment Comment by kbp It works the same way in Haskell, eg main = do let x = 2 let x = "foo" y <- pure 3 y <- pure "bar" putStrLn $ x ++ y which is really the same as main = let x = 2 in let x = "foo" in pure 3 >>= \y -> pure "bar" >>= \y -> putStrLn $ x ++ y So it works pretty naturally where each assignment is kind of like a new scope. If the type system is good, I don't think it really causes issues. parent kbp 2 years ago