【问题标题】:Suggested ScopedTypeVariables In a pattern type-signature模式类型签名中建议的 ScopedTypeVariables
【发布时间】:2015-12-16 16:00:48
【问题描述】:

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

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

【问题讨论】:

  • 您能否在fibo 定义上方包含上下文?为什么要缩进?
  • 在 7.10 之前的 GHC 中,使用-fwarn-tabs。在最近的 GHC 中,请注意此警告,现在默认启用。并且不要使用标签。
  • 顺便说一句,你可能应该启用ScopedTypeVariables,并学习使用它。这是一个非常有用且友好的扩展。

标签: haskell pattern-guards


【解决方案1】:

您的程序中的缩进是错误的,而 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>           | ...
    

    不要使用标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多