2014-11-22 76 views
0

我正在爲此付出努力。這就是我所嘗試的Haskell幫助 - 計算列表的均值

mean :: [Float] -> Float 
mean list = (sum list)/(fromInt (length list)) 

我得到一個錯誤fromInt。我不知道爲什麼會發生這種情況,我們非常感謝您的幫助。

我得到的錯誤是:不在範圍內:`fromInt」

我不能用遞歸的方法。

如果您有任何提示和網站,請不要讓我知道

非常感謝你

+1

你應該告訴我們錯誤信息是什麼。 – ErikR 2014-11-22 15:30:13

+0

您應該將錯誤消息複製並粘貼到您的問題中。 – AndrewC 2014-11-22 15:31:47

+0

不在範圍內:'fromInt' – 2014-11-22 15:32:28

回答

3

您正在使用fromInt不存在,這就是錯誤。爲了解決這個問題,請儘快解決。

讓我開始說,你需要fromInt(或替代者,考慮到這是錯誤的)的原因是/函數存在於Fractional類型。你可以看到它在GHCI

Prelude> :t (/) 
(/) :: Fractional a => a -> a -> a 

Prelude> :t length 
length :: [a] -> Int 

length list的輸出和IntInt不是Fractional。您可以從GHCI與:i檢查,讓您也是一種類的實例:

Prelude> :i Fractional 
class Num a => Fractional a where 
    (/) :: a -> a -> a 
    recip :: a -> a 
    fromRational :: Rational -> a 
     -- Defined in `GHC.Real' 
instance Fractional Float -- Defined in `GHC.Float' 
instance Fractional Double -- Defined in `GHC.Float' 

所以,不,Int不是Fractional一個實例,只FloatDoubleFractional,因此不能使用/ 。您需要將length list的輸出轉換爲Fractional,我的猜測是您正在嘗試使用fromIntegral,它將從Integral轉換爲Num,並且您不小心寫入了fromInt

我想這是因爲fromIntegral是一個類型轉換函數 「做了你需要什麼」:

Prelude> :t fromIntegral 
fromIntegral :: (Integral a, Num b) => a -> b 

length list輸出,是IntIntegral

Prelude> :i Integral 
class (Real a, Enum a) => Integral a where 
    -- [...] 
instance Integral Integer -- Defined in `GHC.Real' 
instance Integral Int -- Defined in `GHC.Real' 

無一不FloatDouble,即Fractional,因此支持/,分別爲Num

Prelude> :i Num 
class Num a where 
    -- [...] 
instance Num Float -- Defined in `GHC.Float' 
instance Num Double -- Defined in `GHC.Float 

所以通過使用它,你可以轉換一個IntFractional型,讓你的函數編譯:

mean :: [Float] -> Float 
mean list = sum list/fromIntegral (length list) 

有關轉換在Haskell如何數值類型工作的一個參考,看看Converting NumbersHaskell.org

1

錯誤說東西是「不在範圍內」僅僅意味着您使用的名稱在特定的地方並不意味着任何東西。在這種情況下,這是因爲你寫了fromInt,並且沒有這樣的功能可用。在某些情況下,您可能必須導入某個模塊才能將某些內容帶入範圍。例如,要使用inits函數,您必須導入Data.List,並使用Seq類型,您必須導入Data.Sequence

有點更加微妙,你不能使用本地變量的範圍之外:雖然有一個x某個模塊中

y = let x = 3 in x*5 
z = x + 4 -- Error: x is not in scope 

,這只是在let表達式中的範圍。