为什么`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在外面不可见。

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

上一篇: Why is `2 + x = 7` valid Haskell?

下一篇: Nexmo API credentials error