2014-11-22 42 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表达式中的范围。