As I am working on learning Haskell, I understand it is a purely functional language. I am having trouble understanding why let-statements don’t violate purity.
For example (in ghci):
Prelude> let e = exp 1
Prelude> e
2.718281828459045
Prelude> let e = 2
Prelude> e
2
isn’t my second let statement producing a side effect? Or is the second let statement a new closure?
Your second
letcreates a new binding forethat shadows the existing variable. It does not modifye. You can easily check this with the following: