我正在爲此付出努力。這就是我所嘗試的Haskell幫助 - 計算列表的均值
mean :: [Float] -> Float
mean list = (sum list)/(fromInt (length list))
我得到一個錯誤fromInt
。我不知道爲什麼會發生這種情況,我們非常感謝您的幫助。
我得到的錯誤是:不在範圍內:`fromInt」
我不能用遞歸的方法。
如果您有任何提示和網站,請不要讓我知道
非常感謝你
我正在爲此付出努力。這就是我所嘗試的Haskell幫助 - 計算列表的均值
mean :: [Float] -> Float
mean list = (sum list)/(fromInt (length list))
我得到一個錯誤fromInt
。我不知道爲什麼會發生這種情況,我們非常感謝您的幫助。
我得到的錯誤是:不在範圍內:`fromInt」
我不能用遞歸的方法。
如果您有任何提示和網站,請不要讓我知道
非常感謝你
您正在使用fromInt
不存在,這就是錯誤。爲了解決這個問題,請儘快解決。
讓我開始說,你需要fromInt
(或替代者,考慮到這是錯誤的)的原因是/
函數存在於Fractional
類型。你可以看到它在GHCI
:
Prelude> :t (/)
(/) :: Fractional a => a -> a -> a
Prelude> :t length
length :: [a] -> Int
的length list
的輸出和Int
和Int
不是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
一個實例,只Float
和Double
是Fractional
,因此不能使用/
。您需要將length list
的輸出轉換爲Fractional
,我的猜測是您正在嘗試使用fromIntegral
,它將從Integral
轉換爲Num
,並且您不小心寫入了fromInt
。
我想這是因爲fromIntegral
是一個類型轉換函數 「做了你需要什麼」:
Prelude> :t fromIntegral
fromIntegral :: (Integral a, Num b) => a -> b
的length list
輸出,是Int
是Integral
:
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'
無一不Float
和Double
,即Fractional
,因此支持/
,分別爲Num
:
Prelude> :i Num
class Num a where
-- [...]
instance Num Float -- Defined in `GHC.Float'
instance Num Double -- Defined in `GHC.Float
所以通過使用它,你可以轉換一個Int
爲Fractional
型,讓你的函數編譯:
mean :: [Float] -> Float
mean list = sum list/fromIntegral (length list)
有關轉換在Haskell如何數值類型工作的一個參考,看看Converting NumbersHaskell.org。
錯誤說東西是「不在範圍內」僅僅意味着您使用的名稱在特定的地方並不意味着任何東西。在這種情況下,這是因爲你寫了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
表達式中的範圍。
你應該告訴我們錯誤信息是什麼。 – ErikR 2014-11-22 15:30:13
您應該將錯誤消息複製並粘貼到您的問題中。 – AndrewC 2014-11-22 15:31:47
不在範圍內:'fromInt' – 2014-11-22 15:32:28