How can two similar functions have different polymorphic types in Haskell?

Viewed 134

Im pretty much new to Haskell, so if Im missing key concept, please point it out.

Lets say we have these two functions:

fact n
     | n == 0 = 1
     | n > 0  = n * (fact (n - 1))

The polymorphic type for fact is (Eq t, Num t) => t -> t Because n is used in the if condition and n must be of valid type to do the == check. Therefor t must be a Number and t can be of any type within class constraint Eq t

fib n
    | n == 1 = 1
    | n == 2 = 1
    | n > 2  = fib (n - 1) + fib (n - 2)

Then why is the polymorphic type of fib is (Eq a, Num a, Num t) => a -> t?

I don't understand, please help.

2 Answers
Related