[英]Haskell Location Definition “No instance for (Fractional Int) arising from a use of ‘/’”
我正在嘗試創建的函數的本地定義中收到錯誤“ 由於使用'/'而導致的(Fractional Int)沒有實例 ”,該錯誤決定了要確定的整數(三個)是多少高於所有給定整數的平均值。 因此,我在函數內部創建了一個局部定義以計算平均值,以便隨后將其用於防護檢查。 我在另一個定義(在另一個文件中)中使用了相同的代碼來計算平均值,並且該方法有效。 我嘗試將“ fromIntegral ”函數調用放在不同的位置,但是它不起作用,我在哪里出錯?
這是代碼:
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage a b c
| a > average && b > average = 2
| a > average && c > average = 2
| b > average && c > average = 2
| a > average = 1
| b > average = 1
| c > average = 1
| otherwise = 0
where
average = fromIntegral (a + b + c) / 3
錯誤被標記在最后一行。
謝謝。
您正在比較a
(這是一個Int
)和average
(這是Fractional a => a
)。 由於(>) :: a -> a Bool
,GHC假定average
也是Int
,這是行不通的。 您需要將average
更改為Int
(例如,通過round
),或者將a
, b
和c
更改為Double
或Float
。
您還可以比較整數。 這個想法是x < (a + b + c)/3
等於3*x < a + b + c
。
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage a b c
| gti a av && gti b av = 2
| gti a av && gti c av = 2
| gti b av && gti c av = 2
| gti a av = 1
| gti b av = 1
| gti c av = 1
| otherwise = 0
where
av = a + b + c
gti x m = 3*x > m
這是您想到的解決方案的更干凈的版本:
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage a b c
| a' > average && b' > average = 2
| a' > average && c' > average = 2
| b' > average && c' > average = 2
| a' > average = 1
| b' > average = 1
| c' > average = 1
| otherwise = 0
where
average = a' + b' + c' / 3
a' = fromIntegral a
b' = fromIntegral b
c' = fromIntegral c
您可以進一步簡化為:
howManyAboveAverage a b c = length (filter (> average) [a', b', c'])
where
average = a' + b' + c' / 3
a' = fromIntegral a
b' = fromIntegral b
c' = fromIntegral c
我設法通過在與平均值進行比較的任何參數之前添加“ fromIntegral”來解決此問題。
新的(有效的)代碼:
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage a b c
| fromIntegral a > average && fromIntegral b > average = 2
| fromIntegral a > average && fromIntegral c > average = 2
| fromIntegral b > average && fromIntegral c > average = 2
| fromIntegral a > average = 1
| fromIntegral b > average = 1
| fromIntegral c > average = 1
| otherwise = 0
where
average = fromIntegral (a + b + c) / 3
看起來有點凌亂/麻煩,所以如果有人有其他建議(更清潔),請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.