2015-09-19 26 views
1

我開始編寫Haskell代碼。 我嘗試使用衛兵寫一個斐波納契函數 -建議ScopedTypeVariables在模式類型簽名

fibo :: (Num z, Ord z) => z -> z 
    fibo d 
    | d <= 0 = 0 
    | d == 1 = 1 
    | otherwise = fibo (d-1) + fibo (d-2) 

我得到這個錯誤: -

非法類型簽名: '(民Z,奧德Z)=>ž - >žFIBO d' 也許你打算使用ScopedTypeVariables 在一個模式類型簽名

但是另一個函數 - 複製我寫了類似的方式編譯和工作正常。 我可以寫另一種方式的斐波那契,但我想知道錯誤是什麼

+3

您可以在fibo定義之上加入上下文嗎?爲什麼縮進? – Cirdec

+1

在7.10之前的GHC中,使用'-fwarn-tabs'。在最近的GHC中,請注意此警告,現在默認啓用。並且不要使用標籤。 – dfeuer

+0

順便說一句,你應該可以啓用'ScopedTypeVariables',並學會使用它。這是一個非常有用和友好的擴展。 – dfeuer

回答

7

您的程序中的縮進是錯誤的,並且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>   | ... 
    

    不要使用標籤。