[Haskell-beginners] Ratio data constructor

Galaxy Being borgauf at gmail.com
Tue Jul 20 21:16:55 UTC 2021


... does the last question have to do with a "smart constructor" by chance?
If so, how?

On Tue, Jul 20, 2021 at 3:42 PM Galaxy Being <borgauf at gmail.com> wrote:

> I'm investigating rational numbers with Haskell. This is the source I've
> found
>
> data Ratio a = !a :% !a deriving (Eq)
>
> reduce ::  (Integral a) => a -> a -> Ratio a
> {-# SPECIALISE reduce :: Integer -> Integer -> Rational #-}
> reduce _ 0              =  ratioZeroDenominatorError
> reduce x y              =  (x `quot` d) :% (y `quot` d)
>                            where d = gcd x y
> (%) :: (Integral a) => a -> a -> Ratio a
> x % y =  reduce (x * signum y) (abs y)
>
> The Ratio data type would seem to be a parameterized type with two
> parameters of the same type that must be "settled" in that they're not to
> be lazily dealt with. Then the :% is the data constructor, the : meaning
> it's a data constructor and not just an operation function. So this could
> have been
>
> data Ratio a = :% !a !a deriving (Eq)
>
> correct? But then what confuses me is in reduce, why
>
> reduce x y  =  (x `quot` d) :% (y `quot` d)
>
> and not just %? We have :% defined in the data type and then (%) defined
> as a function. What is going on here?
>
> --
>> Lawrence Bottorff
> Grand Marais, MN, USA
> borgauf at gmail.com
>


-- 
⨽
Lawrence Bottorff
Grand Marais, MN, USA
borgauf at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20210720/dcb3378d/attachment.html>


More information about the Beginners mailing list