On Sun, Apr 02, 2006 at 10:53:02AM +0100, Malcolm Wallace wrote: > To: [email protected] > From: Malcolm Wallace <[EMAIL PROTECTED]> > Date: Sun, 2 Apr 2006 10:53:02 +0100 > Subject: Re: [Haskell-cafe] casting numerical types > > Matthias Fischmann <[EMAIL PROTECTED]> writes: > > > avg :: (FractionalOrIntegral a) => [a] -> a > > avg xs = sum (map fromFractionalOrIntegral xs) / (fromIntegral (length > > xs)) > > Your condition is probably too strong. For one thing, there is no need > to convert every element of the list being summed, just its result. Also, > does the final result need to be the same type as the elements? > > avg :: (Num a, Fractional b) => [a] -> b > avg xs = fromRational (sum xs % toInteger (length xs))
you are right, your version looks better, and i managed to make ghc
eat these variants:
avg' :: (RealFrac a, Fractional b) => [a] -> b
avg' xs = fromRational (round (sum xs) % toInteger (length xs))
avg'' :: (RealFrac a, Fractional b) => a -> [a] -> b
avg'' epsilon xs = fromRational ((1 % toInteger (length xs)) * approxRational
(sum xs) epsilon)
But the problem is that (%) requests integral types, and I do not want
to round my input. Also, I have the same problem as above that
Integral types are not RealFrac, so these do not accept [Int] as
input. When I try yours, however, I get:
Couldn't match the rigid variable `a' against `Integer'
`a' is bound by the type signature for `avg'
Expected type: a
Inferred type: Integer
In the application `toInteger (length xs)'
In the second argument of `(%)', namely `toInteger (length xs)'
So do I need 'toNum' now?
m.
signature.asc
Description: Digital signature
_______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
