> "Mike T. Machenry" <[EMAIL PROTECTED]> writes:
> > I recently desided I wanted a bunch function to return
> > float instead of Int. [...] I found fromInteger but it
> > didn't seem to work on the return value of the cardinality
> > function for instance.
>
> Try fromIntegral, which works for Int and Integer, too.


Casting an Integral value to a Fractional value to perform arithmetic 
operations, is a very common need and I don't like adding fromIntegral 
everywhere, so ended up writing a (very simple) module with generalized 
arithmetic operators (see attachment). The � next to the operations indicate 
a cast from an Integral to a Fractional value. 

J.A.


module CrossTypeOps where


-- Addition
(+�)     :: (Fractional a, Integral b)=> a -> b -> a
(+�) x n = x+fromIntegral n

(�+)     :: (Integral a, Fractional b)=> a -> b -> b
(�+) n x = fromIntegral n + x

(�+�)     :: (Integral a, Fractional b)=> a -> a -> b
(�+�) m n = fromIntegral m+fromIntegral n


-- Difference
(-�)     :: (Fractional a, Integral b)=> a -> b -> a
(-�) x n = x-fromIntegral n

(�-)     :: (Integral a, Fractional b)=> a -> b -> b
(�-) n x = fromIntegral n - x

(�-�)     :: (Integral a, Fractional b)=> a -> a -> b
(�-�) m n = fromIntegral m-fromIntegral n


-- Multiplication
(*�)     :: (Fractional a, Integral b)=> a -> b -> a
(*�) x n = x*fromIntegral n

(�*)     :: (Integral a, Fractional b)=> a -> b -> b
(�*) n x = fromIntegral n * x

(�*�)     :: (Integral a, Fractional b)=> a -> a -> b
(�*�) m n = fromIntegral m*fromIntegral n


-- Division 
(/�)     :: (Fractional a, Integral b)=> a -> b -> a
(/�) x n = x / fromIntegral n

(�/)     :: (Integral a, Fractional b)=> a -> b -> b
(�/) n x = fromIntegral n / x

(�/�)     :: (Integral a, Fractional b)=> a -> a -> b
(�/�) m n = fromIntegral m / fromIntegral n


-- Priorities
infixl 6  +�, �+, �+�, -�, �-, �-�
infixl 7  *�, �*, �*�, /�, �/, �/�



Reply via email to