When I try to compile
main = putStrLn $ show x where 2 + x = 7
error: Variable not in scope: x | 1 | main = putStrLn $ show x | ^
So it seems that
2 + x = 7 is by itself syntactically valid, although it doesn't actually define
x. But why is it so?
It is valid because it defines
main = putStrLn (3 + 4) where -- silly redefinition of `+` follows 0 + y = y x + y = x * ((x-1) + y)
Above, the Prelude
(+) function is shadowed by a local binding. The result will be
Turning on warnings should point out the dangerous shadowing.
<interactive>:11:6: warning: [-Wname-shadowing] This binding for ‘+’ shadows the existing binding