繁体   English   中英

为什么`2 + x = 7`有效Haskell?

[英]Why is `2 + x = 7` valid 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 = print (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在外面不可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM