2013-10-28 75 views
2
No instance for (Fractional Int) arising from a use of `leap' 
Possible fix: add an instance declaration for (Fractional Int) 
In the first argument of `(==)', namely `leap (x)' 
In the second argument of `(&&)', namely `leap (x) == 1' 
In the expression: (y == 2) && leap (x) == 1 

獲得在ghci中加載文件時,這個錯誤分數詮釋錯誤[哈斯克爾]

這是造成

daysInMonth :: Int -> Int -> Int 
daysInMonth y x 
    | (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) = 31 
    | (y == 4 || y == 6 || y == 9 || y == 11) = 30 
    | (y == 2) && leap(x) == 1 = 28 
    | (y == 2) && leap(x) == 0 = 29 
    where 
    leap a = if (a/4) == 0 then return 1 else return 0 

回答

3

你試圖計算a/4其中a(錯誤的FUNC其中只有等於xInt)是IntInt類型不屬於Fractional類型類型,因此/未定義爲Int s。爲了做到你想要什麼,你可以:

  1. 轉換aFractional類型寫if fromIntegral a/4 == 0 then ...

  2. 或者,如果你想要做的「整數除法」,丟棄剩餘部分,寫if quot a 4 == 0 then ...

此外,Haskell中的return與其他語言中的return不同。在這裏擺脫它。

(同樣也that's not how you determine leap years

+0

好的謝謝你的建議:)葉,我知道我們的講師說,使用製作更簡單的目的。 – rob1994