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

New*_*der 1 haskell pattern-guards

我开始编写Haskell代码.我试图用卫兵写一个斐波纳契函数 -

    fibo :: (Num z, Ord z) => z -> z
    fibo d
    | d <= 0 = 0
    | d == 1 = 1
    | otherwise = fibo (d-1) + fibo (d-2)
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误: -

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

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

Rei*_*ton 9

你的程序中的缩进是错误的,StackOverflow对选项卡的奇怪处理使得你的问题中的缩进以不同的方式出错.

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

    fibo :: (Num z, Ord z) => z -> z
    fibo d
      | d <= 0 = 0
      | ...
    
    Run Code Online (Sandbox Code Playgroud)

    前两行应该在同一列中开始,带有防护的行应该比那些行更加缩进.

  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
      | ...
    
    Run Code Online (Sandbox Code Playgroud)

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

    <sp><sp><sp><sp>fibo :: (Num z, Ord z) => z -> z
    <tab>           fibo d
    <tab>           | d <= 0 = 0
    <tab>           | ...
    
    Run Code Online (Sandbox Code Playgroud)

    不要使用标签.