What does the type of number literals mean, e.g. 5 :: Num a => a (or more verbosely: 5 :: forall a. Num a => a)?
Read n :: Num a => a as saying: n has any type whatsoever, as long as that type is an instance of the Num typeclass.
Haskell has a typeclass Num for numbers which generalized across various concrete number types like Double, Float, Int and Integer.
Haskell will always give the most general typeclass that supports the numeric operations you are using:
repl example
> :t 5 + 3
5 + 3 :: Num a => a -- (1)!
> :t 5 / 3
5 / 3 :: Fractional a => a -- (2)!
> :t 5 ** 3
5 ** 3 :: Floating a => a -- (3)!
- (+)is an operation supported by the- Numtypeclass.
- (/)is an operation supported by- Fractional, a class that inherits from- Num
- (**)is an operation supported by- Floating, a class that inherits from- Num
Like all universally quantified values, a value of type forall a. Num a => a can be given as input to any function that takes an concrete number type:
repl example
  > n = 5
> :t n
n :: Num a => a
> double = (\x -> x * x) :: Double -> Double
> double n
25.0
  
    
      Last update:
      January 12, 2023
      
        
Created: August 18, 2022
  
  
  Created: August 18, 2022