Why is `2 + x = 7` valid Haskell?

When I try to compile

main = putStrLn $ show x where
    2 + x = 7

GHC complains

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 + instead.

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 24 , not 7 , consequently.

Turning on warnings should point out the dangerous shadowing.

<interactive>:11:6: warning: [-Wname-shadowing]
    This binding for ‘+’ shadows the existing binding

You're defining a local function called + .

2 + x = 7 is equivalent to (+) 2 x = 7 , which is equivalent to

(+) y x | y == 2 = 7

x is an (unused) parameter, and the function is only defined if the first argument is 2 . That's not very useful, but it explains why x is not visible outside.

链接地址: http://www.djcxy.com/p/866.html

上一篇: GHC for Snow Leopard的二进制文件?

下一篇: 为什么`2 + x = 7`有效的Haskell?