> "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