[Haskell-beginners] gcd

Daniel Fischer daniel.is.fischer at web.de
Fri May 1 16:44:52 EDT 2009


Am Freitag 01 Mai 2009 22:28:12 schrieb Daniel Carrera:
> I'm just another Haskell beginner, but what Steve says makes sense.

Yes, it's something I've often been annoyed by.
It's a wart (rather an error) in the Haskell report 
http://haskell.org/onlinereport/basic.html#sect6.4.2
where it's specified that gcd 0 0 shall raise a runtime error. I hope that gets fixed in 
the next standard.

> Perhaps something like this:
>
> gcd a b | b == 0    = a
>
>          | b < 0     = gcd (-b) a
>          | otherwise = gcd b (a `rem` b)
>
> Daniel.

No, that would check for negative numbers in each iteration. Just remove the line

gcd 0 0         =  error "Prelude.gcd: gcd 0 0 is undefined"

and everything's fine.
>
> Steve wrote:
> > I had a look at the gcd definition in GHC 6.10.1
> > ghc-6.10.1/libraries/base/GHC/Real.lhs
> >
> > -- | @'gcd' x y@ is the greatest (positive) integer that divides both
> > @x@
> > -- and @y@; for example @'gcd' (-3) 6@ = @3@, @'gcd' (-3) (-6)@ = @3@,
> > -- @'gcd' 0 4@ = @4 at .  @'gcd' 0 0@ raises a runtime error.
> > gcd             :: (Integral a) => a -> a -> a
> > gcd 0 0         =  error "Prelude.gcd: gcd 0 0 is undefined"
> > gcd x y         =  gcd' (abs x) (abs y)
> >                    where gcd' a 0  =  a
> >                          gcd' a b  =  gcd' b (a `rem` b)
> >
> > Why is gcd 0 0 undefined?
> >
> > http://en.wikipedia.org/wiki/Greatest_common_divisor says:
> > "It is useful to define gcd(0, 0) = 0 and lcm(0, 0) = 0 because then the
> > natural numbers become a complete distributive lattice with gcd as meet
> > and lcm as join operation. This extension of the definition is also
> > compatible with the generalization for commutative rings given below."
> >
> > An added advantage, for haskell, of defining gcd 0 0 = 0 is that gcd
> > would change from being a partial function to a total function.
> >
> > Regards,
> > Steve



More information about the Beginners mailing list