1

我开始编写 Haskell 代码。我尝试使用 Guards 编写斐波那契函数 -

    fibo :: (Num z, Ord z) => z -> z
    fibo d
    | d <= 0 = 0
    | d == 1 = 1
    | otherwise = fibo (d-1) + fibo (d-2)

我收到了这个错误:-

非法类型签名:'(Num z, Ord z) => z -> z fibo d' 也许您打算在模式类型签名中使用 ScopedTypeVariables

然而,另一个函数 - 复制我以类似的方式编写,编译和工作正常。我可以用另一种方式写斐波那契,但我想知道错误是什么

4

1 回答 1

10

您的程序中的缩进是错误的,并且 StackOverflow 对制表符的奇怪处理使您的问题中的缩进以不同的方式出错。

  1. 你的程序应该像这样缩进:

    fibo :: (Num z, Ord z) => z -> z
    fibo d
      | d <= 0 = 0
      | ...
    

    前两行应该从同一列开始,带有保护的行应该比那些行缩进更多。

  2. 您问题中显示的程序与您提到的错误的方式不同:带有警卫的行必须比前面的行缩进更多。发生这种情况是因为 StackOverflow 对制表符的处理方式非标准。不要使用标签。

  3. 您的错误与 GHC 以如下缩进方式查看您的程序一致:

    fibo :: (Num z, Ord z) => z -> z
      fibo d               -- wrong, must start in same column as previous line
      | d <= 0 = 0
      | ...
    

    我们可以重建您的原始程序一定是

    <sp><sp><sp><sp>fibo :: (Num z, Ord z) => z -> z
    <tab>           fibo d
    <tab>           | d <= 0 = 0
    <tab>           | ...
    

    不要使用标签。

于 2015-09-19T16:25:22.380 回答