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.

Attachment: signature.asc
Description: Digital signature

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to