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



开始写Haskell代码。我试着用守卫写一个斐波那契函数-

    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在模式类型签名

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

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

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

    fibo :: (Num z, Ord z) => z -> z
    fibo d
      | d <= 0 = 0
      | ...
    
  2. 前两行应该在同一列中开始,并且带保护符的行应该比这些行更缩进。
  3. 在你的问题中显示的程序是错误的,与你提到的错误不同:带保护符的行必须比前面的行更缩进。这是因为StackOverflow对制表符的处理不标准。

  4. 您的错误与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>           | ...
    

相关内容

  • 没有找到相关文章

最新更新