努力理解GHC编译器及其神秘的缩进规则但不幸的是这段代码拒绝编译
抱歉,我之前已经问过这个问题,但是无法编译这段代码
fib :: Int -> [Int]
fib 1 = [1]
fib 2 = [1,1]
fib n =
if n > 1
then
reverse list
where
list = ((head (fib (n-1)) + head (fib (n-2))) : fib (n-1))
else
error "Exception, n cannot be less than 0"
答案 0 :(得分:4)
无论缩进如何,此句法位置都不允许where
。
通常,绑定中允许where
子句看起来像a = b where c
。形式上,根据language report,where
是 rhs 的一部分(代表“右侧(声明/绑定)”和 rhs 定义如下:
rhs →= exp [其中 decls ]
| gdrhs [ decls ]
和 gdrhs 是受保护的右侧,定义为
gdrhs →警卫 = exp [ gdrhs ]
所以where
只能在使用=
时使用,即进行绑定。
(还有其他类型的where
子句:在模块中,在类/实例定义中,在GADT定义中,但那些只是切向相关的。)
在表达式中,使用let ... in
:
let list = ((head (fib (n-1)) + head (fib (n-2))) : fib (n-1))
in reverse list
或直接
reverse ((head (fib (n-1)) + head (fib (n-2))) : fib (n-1))