Yes, fromInteger and == is used for pattern matching on numbers. However, on GHC you can use -XNoImplicitPrelude to make it use whatever fromInteger and == that's in scope (without any Num or Eq). Eg. if == is a method of MyEq class and fromInteger is a method of MyNum, and MyNum doesn't inherit MyEq, then the type of this function f 0 = "" f x = 'e' : f (x-1) Will be inferred as (MyEq a, MyNum a) => a -> String /Tobias -----Original Message----- From: haskell-cafe-bounces@haskell.org [mailto:haskell-cafe-bounces@haskell.org] On Behalf Of David Menendez Sent: den 19 november 2008 01:00 To: Henning Thielemann Cc: Haskell Cafe Subject: Re: [Haskell-cafe] Pattern matching on numbers? On Tue, Nov 18, 2008 at 6:56 PM, Henning Thielemann <lemming@henning-thielemann.de> wrote:
On Tue, 18 Nov 2008, Ryan Ingram wrote:
How does this work?
fac n = case n of 0 -> 1 _ -> n * fac (n-1)
ghci> :t fac fac :: (Num t) => t -> t
The first line of "fac" pattern matches on 0. So how does this work over any value of the Num typeclass? I know that the "1" on the rhs of fac are replaced with (fromInteger 1), but what about numeric literals in patterns? Does it turn into a call to (==)?
As far as I know, yes. It is even possible to trap into an error on pattern matching this way if fromInteger generates an 'undefined'.
As I understand it, the use of (==) in numeric pattern matching is why Num requires Eq. -- Dave Menendez <dave@zednenem.com> <http://www.eyrie.org/~zednenem/> _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe