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

Im a lot of new for Haskell, so if I do not understand the key concept, specify it.

Suppose we have two functions:

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

Polymorphic type for Since it is used in the if condition, and n must have a valid type for verification . Therefore, there must be and can be any type within the class constraintfact (Eq t, Num t) => t -> tn==tNumbertEq t

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

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

I do not understand, please help.

+4
source share
2 answers

Haskell always strives to get the most common type signature.

fact , , :

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

. n * (fact (n-1)). (*) :: a -> a -> a. , . n n, , . n == 0, , (==) :: Eq a => a -> a -> Bool, , Eq a =>, 0 :: Num a => a. , fact :: (Num a, Eq a) => a -> a.

fib :

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

, n Eq a, Num a, n == 1 (==) :: Eq a => a -> a -> Bool 1 :: Num a => a. n . , fib (n-1) + fib (n-2), n-1 n-2 . , , . - : Num t: , 1 1 :: Num t => t, : fib (n-1) + fib (n-2), (+) :: Num t => t -> t -> t.

+7

, fact , :

fact n | ...  = n * ...

IOW, , n:

fact 3  ≡  n * (n-1) * (n-2) * 1

, , ,

(*) :: Num n => n -> n -> n

fib: -. IOW,

fib 3  ≡  (1 + 1) + 1

n , .

, n, , , , .

, fib : (Eq a, Num a, Num t) => a -> t , (Eq t, Num t) => t -> t. , fact, , :

fact' :: (Eq a, Integral a, Num t) => a -> t
fact' = fromIntegral . fact

, Integer - , fact, Integer. , -, :

fact'' :: (Eq t, Integral a, Num t) => a -> t
fact'' = fact . fromIntegral

Int -> Integer, .

(Eq t, Num t) => t -> t, , . , , fact - , ; , , - , .

+5

Source: https://habr.com/ru/post/1682846/


All Articles