stdDev
:: (Floating a1, Floating a, Integral a1) =>
When you see a type like that it means type a1 is both a Floating and also an Integral. Intellectually that is impossible, but as far as ghc is concerned there could be a type that is an instance of both classes, so it allows it. But when you try to call it, there's no type in scope that you can affix to a1 to please it, so it will always error.I am trying to calculate the standard deviation for each index in a list of lists of floats. Using Ubuntu 18.04, ghc 8.0.2. I am getting the following runtime error which I have googled and still don't understand what "Integral Float" is exactly or even which parameter is causing the trouble.
*Main> let z = stdDev 0 2 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
Code:
-- 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 Types:
*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
Variables:
*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] ]
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners