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

Haskell 模式类型签名中建议的ScopedTypeVariables,haskell,pattern-guards,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) fibo::(Num z,Ord z)=>z->z 菲波d |d z->z fibo d' 也许您打算使用ScopedTypeVariables 在模式类型签名中 然而

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

    fibo :: (Num z, Ord z) => z -> z
    fibo d
    | d <= 0 = 0
    | d == 1 = 1
    | otherwise = fibo (d-1) + fibo (d-2)
fibo::(Num z,Ord z)=>z->z
菲波d
|d z->z fibo d'
也许您打算使用ScopedTypeVariables
在模式类型签名中

然而,我以类似的方式编写了另一个函数-replicate,它编译和运行良好。
我可以用另一种方式写斐波那契,但我想知道错误是什么

程序中的缩进是错误的,StackOverflow对制表符的奇怪处理以另一种方式使问题中的缩进错误

  • 您的程序应按如下方式缩进:

    fibo :: (Num z, Ord z) => z -> z
    fibo d
      | d <= 0 = 0
      | ...
    
    fibo :: (Num z, Ord z) => z -> z
      fibo d               -- wrong, must start in same column as previous line
      | d <= 0 = 0
      | ...
    
    fibo::(Num z,Ord z)=>z->z
    菲波d
    
    |d您的程序中的缩进是错误的,StackOverflow对制表符的怪异处理使您的问题中的缩进以不同的方式出错

  • 您的程序应按如下方式缩进:

    fibo :: (Num z, Ord z) => z -> z
    fibo d
      | d <= 0 = 0
      | ...
    
    fibo :: (Num z, Ord z) => z -> z
      fibo d               -- wrong, must start in same column as previous line
      | d <= 0 = 0
      | ...
    
    fibo::(Num z,Ord z)=>z->z
    菲波d
    
    |d您能否在
    fibo
    定义上方包含上下文?为什么缩进?在GHC 7.10之前的版本中,请使用
    -fwarn tabs
    。在最近的GHC中,请注意此警告,它现在默认启用。而且不要使用tabs.BTW,无论如何,您应该启用
    ScopedTypeVariables
    ,并学会使用它。这是一个非常有用和友好的扩展。你能在
    fibo
    定义上面包含上下文吗?为什么缩进?在GHC 7.10之前的版本中,请使用
    -fwarn tabs
    。在最近的GHC中,请注意此警告,它现在默认启用。而且不要使用tabs.BTW,无论如何,您应该启用
    ScopedTypeVariables
    ,并学会使用它。这是一个非常有用和友好的扩展。