为何`2 + x = 7`是合法Haskell语法?编译代码提示x未定义?
关于Haskell中
2 + x =7的语法与绑定问题解答 1. 为啥2 + x =7是合法的Haskell语法?
Haskell的语法设计相当灵活,它允许等式左边是任意合法表达式,不局限于单纯的变量名——这背后是模式匹配特性在撑腰。
你可以把2 + x =7看成是(+) 2 x =7的中缀写法,本质上这是在尝试给加法运算符(+)加一条专属规则:“当第一个参数是2,第二个参数是x的时候,这个函数返回7”。虽然这种写法在实际开发中没啥意义(谁没事重新定义加法啊),但从语法规则来说,它完全符合Haskell的函数定义要求——函数可以通过模式匹配,针对不同参数组合给出不同定义,这里的2是字面量模式,x是变量模式,所以语法检查自然会通过。
2. 为啥where子句写了2 + x =7,还报错x没定义?
这是很多刚入坑Haskell的小伙伴容易踩的坑:Haskell里的等式不是代数方程,而是用来定义函数或者绑定值的。
当你在where子句里写2 + x =7时,你不是在“解方程求x的值”,而是在定义一条函数规则:你告诉Haskell,“调用(+)函数传入2和x时,结果是7”。这里的x只是这个函数定义里的占位参数,根本没被绑定任何具体的值。而你在main里想用的x,是需要绑定到具体值的变量,这俩x完全不是一回事——where子句里的x属于那个函数定义的局部参数,根本没在main的作用域里创建一个叫x的绑定,所以GHC才会报错“x不在作用域内”。
要是真想得到x的值(也就是解2+x=7得到x=5),得用Haskell的正确姿势绑定x,比如写成x = 7 - 2,这样x才会被绑定到5,main里就能正常用了。
内容的提问来源于stack exchange,提问作者fghzxm
相关产品推荐
相关产品推荐

