Haskell帮助 - 计算列表的平均值

时间:2014-11-22 15:21:06

标签: haskell

我正在努力解决这个问题。这就是我的尝试

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

我收到了fromInt的错误消息。我不知道为什么会这样,你的帮助非常感谢。

我得到的错误是:不在范围内:`fromInt'

我无法使用递归方法。

如果您有任何提示和网站,请告诉我

非常感谢

3 个答案:

答案 0 :(得分:3)

您正在使用不存在的fromInt,这是错误。对于问题的简短解决方案,请到此结束。

首先让我说,你需要fromInt(或者考虑到错误的替换者)的原因是因为/类型存在Fractional函数。您可以在GHCI上看到它:

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

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

length list的输出为IntInt不是Fractional。您可以使用:i从GHCI进行检查,它还为您提供类型类的实例:

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

因此,通过使用它,您可以将Int转换为Fractional类型并使您的函数编译:

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

有关数值类型转换在Haskell中如何工作的参考,请查看Converting NumbersHaskell.org

答案 1 :(得分:1)

错误表示“不在范围内”只是意味着您使用的名称并不代表特定地点的任何内容。在这种情况下,这是因为你写了fromInt,并且没有这样的功能可用。在某些情况下,您可能必须导入某个模块才能将某些内容纳入范围。例如,要使用inits功能,您必须导入Data.List,并使用Seq类型导入Data.Sequence

更巧妙的是,您不能在其范围之外使用 local 变量:

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

虽然模块中某处有x,但它只在let表达式的范围内。

答案 2 :(得分:0)

这是计算均值的示例

让我们定义一个接受数字列表并返回双精度的函数

mean :: [Double] -> Double
mean (x) = (x1)
    where x1 = sum x / fromIntegral (length x)

main = do 
   print( mean [1..10])