错误:在输入'where'上解析错误

时间:2016-10-04 10:34:34

标签: haskell ghc

努力理解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"

1 个答案:

答案 0 :(得分:4)

无论缩进如何,此句法位置都不允许where

通常,绑定中允许where子句看起来像a = b where c。形式上,根据language reportwhere 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))