哈斯克尔错误"Could not deduce (Integral Float) arising from a use of.."



我是Haskell的新手,正在尝试计算浮点数列表的标准偏差。Ubuntu 18.04, ghc 8.0.2.我收到以下错误,我已经用谷歌搜索过,但仍然不明白"积分浮点"到底是什么。

*Main> let z = stdDev 0 1 y x
<interactive>:250:9: error:
• Could not deduce (Integral Float) arising from a use of ‘stdDev’
from the context: Floating a
bound by the inferred type of z :: Floating a => [a]
at <interactive>:250:5-38
• In the expression: stdDev 0 (length (head (x))) y x
In an equation for ‘z’: z = stdDev 0 (length (head (x))) y x

法典:

-- i is start index, l is length of each list, ms is list of means, 
--    xs is Matrix
stdDev i l ms xs
| i < l     = sqrt(fromIntegral(sumOfMinusMeans i (ms!!i) xs) / 
fromIntegral(l)):(stdDev (i+1) l ms xs)
| otherwise = []
--i is index, m is mean for the index
sumOfMinusMeans i m (x:xs)
| xs == []     = (x!!i - m)**2
| i < length x = (x!!i - m)**2 + (sumOfMinusMeans i m xs)
| otherwise    = 0

类型:

*Main> :t stdDev
stdDev
:: (Floating a1, Floating a, Integral a1) =>
Int -> Int -> [a1] -> [[a1]] -> [a]
*Main> :t sumOfMinusMeans
sumOfMinusMeans :: (Eq t, Floating t) => Int -> t -> [[t]] -> t

变量:

*Main> y
[380.0,1.0]
*Main> x
[[600.0,1.0],[400.0,1.0],[170.0,1.0],[430.0,1.0],[300.0,1.0]]

我找到了解决方案。我需要指定函数类型并添加"fromIntegral",我的一些算法逻辑是错误的。

stdDev :: Int -> Float -> [Float] -> [[Float]] -> [Float]
stdDev i l ms xs
| fromIntegral(i) < length(head(xs)) = sqrt((sumOfMinusMeans i (ms!!i) xs) 
/ l): (stdDev (i+1) l ms xs)
| otherwise                          = []

sumOfMinusMeans :: Int -> Float -> [[Float]] -> Float
sumOfMinusMeans i m (x:xs)
| xs == []  = (x!!i - m)**2
| otherwise = (x!!i - m)**2 + (sumOfMinusMeans i m xs)

相关内容

最新更新