Ok, let it check.
Int :: *
[] :: * -> *
Therefore, when you apply a type Intto a type constructor []:
[] Int :: *
This is another (legal) way of writing
[Int] :: *
Well, that should be pretty easy.
Int :: *
(->) :: * -> * -> *
[] :: * -> *
(->) Int :: * -> *
(->) Int Int :: *
Same as
Int -> Int :: *
and therefore, for the same reasons as above,
[Int -> Int] :: *
But here's the secret .. Get to know the type [].
[] :: * -> *
, , , *. - *, *.
- , . , . , kind * , " ". ( , , .) , , *.