[Haskell-cafe] casting numerical types
fis at wiwi.hu-berlin.de
Sun Apr 2 06:39:32 EDT 2006
On Sun, Apr 02, 2006 at 10:53:02AM +0100, Malcolm Wallace wrote:
> To: haskell-cafe at haskell.org
> From: Malcolm Wallace <Malcolm.Wallace at cs.york.ac.uk>
> Date: Sun, 2 Apr 2006 10:53:02 +0100
> Subject: Re: [Haskell-cafe] casting numerical types
> Matthias Fischmann <fis at wiwi.hu-berlin.de> 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?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org//pipermail/haskell-cafe/attachments/20060402/29726d7d/attachment.bin
More information about the Haskell-Cafe