我正在努力解决这个问题。这就是我的尝试
mean :: [Float] -> Float
mean list = (sum list) / (fromInt (length list))
我收到了fromInt
的错误消息。我不知道为什么会这样,你的帮助非常感谢。
我得到的错误是:不在范围内:`fromInt'
我无法使用递归方法。
如果您有任何提示和网站,请告诉我
非常感谢
答案 0 :(得分:3)
您正在使用不存在的fromInt
,这是错误。对于问题的简短解决方案,请到此结束。
首先让我说,你需要fromInt
(或者考虑到错误的替换者)的原因是因为/
类型存在Fractional
函数。您可以在GHCI
上看到它:
Prelude> :t (/)
(/) :: Fractional a => a -> a -> a
Prelude> :t length
length :: [a] -> Int
length list
的输出为Int
且Int
不是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
的实例,只有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 Numbers的Haskell.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])