建议的 ScopedTypeVariables 在模式类型签名中

Suggested ScopedTypeVariables In a pattern type-signature

我开始编写 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 在模式类型签名中

然而,另一个功能 - 复制我已经用类似的方式编写,编译并运行良好。 我可以用另一种方式写斐波那契数列,但我想知道错误是什么

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

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

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

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

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

  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>           | ...
    

    不要使用制表符。