2010-12-15 80 views
3

我试着做一个函数的迭代/尾递归版本来计算Fibonacci序列的第 n th数,但我得到parse error (possibly incorrect indentation)。这是为什么发生?我正在使用的代码:解析简单的Haskell斐波那契实现的错误

fib n 
    | n < 2 = n 
    | otherwise = fibhelper 0 1 2 n 
    where fibhelper a b curr num 
      | curr == num = a + b 
      | curr < num = fibhelper b (a+b) (curr+1) num 

要清楚,我试图理解的错误 - 为什么发生,它应该如何矫正 - 而不是试图有效地实现fib(我的理解流行zipWith例如已经实施here)。

谢谢!

+0

谢天谢地,您很快收到了一个很好的答案。请,如果可以的话,一定要说出编译器把错误放在哪里,而不仅仅是错误是什么。但是,再次祝贺获得快速,好的答案。 – BMeph 2010-12-15 20:05:18

回答

8

保护部分必须缩进至少一个相对于函数名称的字符。因此如下工作:

fib n 
    | n < 2 = n 
    | otherwise = fibhelper 0 1 2 n 
    where fibhelper a b curr num 
      | curr == num = a + b -- moved one character to the left. 
      | curr < num = fibhelper b (a+b) (curr+1) num 
+0

啊哈!它必须是这样的,但我不知道是什么。谢谢你的帮助! – Kiwi 2010-12-15 16:11:38