我正在为此付出努力。这就是我所尝试的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