Haskell运算符优先级疑问:斐波那契函数表达式解析
关于Haskell优先级与函数应用的解析
核心优先级规则:函数应用 > 所有中缀运算符
Haskell里函数应用的优先级是最高的,比任何中缀运算符(包括+)都高,且是左结合的。你对fibo(n-1) + fibo(n-2)的解析有误,原因如下:
- 首先,Haskell里的
fibo(n-1)不是C风格的函数调用语法,它等价于fibo (n-1)——括号仅用来明确n-1是一个整体参数,避免被解析成(fibo n) - 1。 - 其次,由于函数应用优先级远高于
+,编译器会先分别执行两边的函数应用:先计算fibo (n-1)和fibo (n-2)得到两个数值,再用+将它们相加,实际解析结果是(fibo (n-1)) + (fibo (n-2)),完全符合斐波那契的逻辑,因此不会报错。
关于g = fibo 2 + fibo报错的原因
这个写法不被接受是类型不匹配导致的:
fibo 2调用后返回的是一个数值类型(比如Integer);- 而
fibo本身是函数类型(比如Integer -> Integer); - 中缀运算符
+要求左右两边必须是相同的数值类型,函数与数值无法直接相加,所以GHCi会抛出类型错误。
内容的提问来源于stack exchange,提问作者Ftyupl
相关产品推荐
相关产品推荐

