簡體   English   中英

Haskell位置定義“(使用'/'不會引起(分數整數)實例”)

[英]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 ),或者將abc更改為DoubleFloat

您還可以比較整數。 這個想法是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM