为什么`2 + x = 7`有效的Haskell?
当我尝试编译
main = putStrLn $ show x where
2 + x = 7
GHC抱怨
error: Variable not in scope: x
|
1 | main = putStrLn $ show x
| ^
因此,似乎2 + x = 7
本身在句法上是有效的,尽管它实际上并没有定义x
。 但为什么这样呢?
它是有效的,因为它定义了+
。
main = putStrLn (3 + 4)
where -- silly redefinition of `+` follows
0 + y = y
x + y = x * ((x-1) + y)
以上,Prelude (+)
函数被本地绑定遮蔽。 结果将是24
,而不是7
,因此。
开启警告应该指出危险的阴影。
<interactive>:11:6: warning: [-Wname-shadowing]
This binding for ‘+’ shadows the existing binding
你正在定义一个名为+
的本地函数。
2 + x = 7
相当于(+) 2 x = 7
,相当于
(+) y x | y == 2 = 7
x
是一个(未使用的)参数,并且该函数仅在第一个参数为2
定义。 这不是很有用,但它解释了为什么x
在外面不可见。