Haskell is a pure language. Every Haskell expression is referentially transparent, meaning that you can substitute that expression with its evaluated result without changing the program. Or, put into code: -- this program f expr expr -- apply function f to arguments expr, expr -- is equivalent to this one, which factors out `expr` let x = expr -- introduce a new variable `x` with the value of `expr` in f x x And this is true for all expressions e, and all functions f. These could be complex e...