How to divide a pair of Num values?

Hi Folks, Here is a function that takes a pair of Integral values and divides them: divide_v1 :: Integral a => (a, a) -> a divide_v1 (m, n) = (m + n) `div` 2 I invoke the function with a pair of Integral values and it works as expected: divide_v1 (1, 3) Great. That's perfect if my numbers are always Integrals. Here is a function that takes a pair of Fractional values and divides them: divide_v2 :: Fractional a => (a, a) -> a divide_v2 (m, n) = (m + n) / 2 I invoke the function with a pair of Fractional values and it works as expected: divide_v2 (1.0, 3.0) Great. That's perfect if my numbers are always Fractionals. I would like a function that works regardless of whether the numbers are Integrals or Fractionals: divide_v3 :: Num a => (a, a) -> a divide_v3 (m, n) = (m + n) ___ 2 What operator do I use for ___? Thanks. /Roger

On Wed, Oct 24, 2012 at 09:01:34AM +0000, Costello, Roger L. wrote:
Hi Folks,
Here is a function that takes a pair of Integral values and divides them:
divide_v1 :: Integral a => (a, a) -> a divide_v1 (m, n) = (m + n) `div` 2
I invoke the function with a pair of Integral values and it works as expected:
divide_v1 (1, 3)
Great. That's perfect if my numbers are always Integrals.
Here is a function that takes a pair of Fractional values and divides them:
divide_v2 :: Fractional a => (a, a) -> a divide_v2 (m, n) = (m + n) / 2
I invoke the function with a pair of Fractional values and it works as expected:
divide_v2 (1.0, 3.0)
Great. That's perfect if my numbers are always Fractionals.
I would like a function that works regardless of whether the numbers are Integrals or Fractionals:
divide_v3 :: Num a => (a, a) -> a divide_v3 (m, n) = (m + n) ___ 2
What operator do I use for ___?
As far as I know, you can't do this easily. Or rather, you can, if you're fine to always use `div`, but not if you want different behaviour. If you really want to implement it, you can use a custom type-class, and implement instances both Integral and Fractional for it, using div and respectively (/). Something like (not tested): class SmartDivision a where smartDivide :: a -> a -> a instance (Integral a) => SmartDivision a where smartDivide = div instance (Fractional a) => SmartDivision a where smartDivide = (/) and your divide_v3 becomes: divide_v3 :: (Num a, SmartDivision a) => (a, a) -> a divide_v3 (m, n) = (m + n) `smartDivide` 2 But something doesn't sounds very right about your problem, so I'm not sure I recommend actually implementing the above. regards, iustin
participants (2)
-
Costello, Roger L.
-
Iustin Pop