The following typing rule for function application
f :: A -> B
e :: A
-----------
f e :: B
doesn't take into account an f with class constraints. How can I manually calculate the type of, for example:
( ) :: Num a => a -> a -> a
3 :: Int
---------------------------
( ) 3 :: ?
CodePudding user response:
For:
( ) :: Num a => a -> a -> a
3 :: Int
We know that a (the first parameter) is the same type as Int (the type of 3), so that means that a ~ Int (a and Int are the same type), so that means that:
( ) :: Num a => a -> a -> a
3 :: Int
------------------------------------
( ) 3 :: Num Int => Int -> Int
Since Int is a member of the Num typeclass, we can remove Num Int =>, and thus obtain:
( ) :: Num a => a -> a -> a
3 :: Int
------------------------------------
( ) 3 :: Int -> Int
